You are on page 1of 6

1.

Bộ định thời mềm


1.1.1 Giới thiệu
- Bộ định thời phần mềm (Software Timer) được sử dụng để lên lịch thực hiện chức năng tại một
thời điểm cụ thể trong tương lai hoặc theo các khoảng thời gian đều đặn ở một tần số cố định.
o Chức năng chính của bộ định thời là gọi lại khoảng thời gian hẹn trước hoặc khởi độnglại
bộ đếm.
o Thời gian của bộ đếm: Là khoảng thời gian giữa lúc bắt đầu bộ định thời và thực
hiệnchức năng gọi lại (callback) của nó.

1.1.2 Chức năng


- Software Timer được sử dụng để cài đặt thời điểm thực thi của một function.
o Mặc định Software Timer không được sử dụng, để thêm Software Timer vào chương
trình, cần biên dịch thêm file FreeRTOS/Source/timers.c và set hằng số
configUSE_TIMERS thành 1.

1.1.3 Phân loại


- One-Shot Timer (Mono-timer): Khi bộ đếm thời gian bắt đầu, nó thực hiện chức năng gọi

lại một lần. Loại bộ đếm thời gian đơn này có thể được khởi động lại bằng tay và không

tự khởi động lại.

- Auto-Reload Timer(Callback-Timer): Đây là loại bộ đếm tự động, sau khi bắt đầu và kết

thúc khoảng thời gian cho trước, nó sẽ tự khởi động lại theo thời gian định kỳ mà nó đã

thực hiện.

2.Daemon Task
1.1.4 Giới thiệu
- Daemon Task là một tác vụ FreeRTOS tiêu chuẩn được tạo tự động khi bộ lập lịch bắt đầu. Mức
độ ưu tiên và kích thước ngăn xếp được đặt tại thời gian biên dịch bởi các hằng số cấu hình có
sẵn trong "FreeRTOSConfig.h".

1.1.4.1 Hoạt động


- “Daemon Task” có độ ưu tiên được quy định bởi hằng số configTIMER_TASK_PRIORITY và stack
depth được quy định bởi configTIMER_TASK_STACK_DEPTH.
- Từ “Daemon Task” có thể tạo ra nhiều Software Timer.
- Callback function của Software Timer sẽ được thực thi khi Timer expires, cần có nguyên mẫu là
hàm: void timerCallback(TimerHandle_t timer);
- Callback function này sẽ được thực thi từ đầu đến cuối và kết thúc như các function bình
thường, nó phải thật ngắn gọn và không được chứa bất cứ API nào có thể khiến “Daemon Task”
rơi vào trạng thái blocked (ví dụ như vTaskDelay(), xQueueReceive() với thời gian block khác 0,…
khi truy cập queue hay semaphore).
3.Các API FreeRTOS thao tác với Software timer
1.2 Tạo một Software Timer mới:
- API: TimerxTimerCreate().
- Timer khi được tạo ra vẫn ở trạng thái Dormant.
- Cú pháp: TimerHandler_t TimerxTimerCreate(const char * const timer_name, TickType_t
timer_period, UbaseType_t auto_reload, void * timer_id, TimerCallbackFunction_t
callbackFunction);
- Trong đó:
o timer_name – tên của timer được tạo;
o timer_period – chu kỳ của timer tính theo tick;
o auto_reload – pdTRUE: tạo auto-load timer, pdFALSE: tạo one-shot timer;
o timer_id – ID của timer, dùng để lựa chọn timer khi có nhiều timer cùng expire;
o callbackFunction – callback function của Timer

1.3 Để khởi động 1 Software Timer:


- API: xTimerStart().
- Cú pháp: BaseType_t xTimerStart(TimerHandle_t timer, TickType_t ticks_to_wait);

1.4 Reset 1 Software Timer:


- API: xTimerReset().
- Cú pháp: BaseType_t xTimerReset(TimerHandle_t timer, TickType_t ticks_to_wait);

1.5 Thay đổi chu kỳ của Software Timer:


- API: xTimerChangePeriod().
o Nếu timer đang ở trạng thái “ngủ đông” (dormant), nó sẽ tính toán lại thời điểm expire
và bắt đầu hoạt động.
o Nếu timer đang ở trạng thái Running, nó sẽ tính toán lại thời điểm expire bắt đầu từ thời
điểm mà API xTimerChangePeriod() được gọi.

1.6 Thay đổi ID cho một software timer:


- API: vTimerSetTimerID().

1.7 Lấy giá trị ID:


- API: pvTimerGetTimerID().

1.8 Xóa bộ hẹn giờ khi các công việc của bộ hẹn giờ không còn cần thiết trong hệ
thống:
- API: xTimerDelete().

1.9 Trả về thời gian mà bộ hẹn giờ khi kết thúc, callback function sẽ thực thi:

- API: xTimerGetExpiryTime().

1.10 Trả về tên văn bản có thể đọc được do người lập trình gán khi bộ định thời được
tạo.:
- API: pcTimerGetName().
1.11 Truy vấn bộ hẹn giờ để xác định xem bộ định thời có đang chạy hay không
- API: xTimerIsTimerActive().
- Đồng hồ bấm giờ sẽ không chạy nếu:
o 1. Bộ đếm thời gian đã được tạo, nhưng không bắt đầu.
o 2. Bộ hẹn chỉ hẹn một lần và chưa được khởi động một lần nào nữa.

1.12 Trì hoãn việc thực thi một chức năng đối với tác vụ daemon RTOS:
- API: xTimerPendFunctionCall().

1.13 Dừng thời gian mà bộ đếm đang chạy:


- API: xTimerStop().

4.TH8.2
#include <Arduino_FreeRTOS.h>

#include <timers.h>

#include <task.h>

/ * Ấn định cho bộ hẹn giờ một lần và tự động nạp lại lần lượt là 6 giây . * /

#define mainONE_SHOT_TIMER_PERIOD pdMS_TO_TICKS( 3333 )

#define mainAUTO_RELOAD_TIMER_PERIOD pdMS_TO_TICKS( 500 )

// tạo các trình xử lý tham chiếu cho bộ hẹn giờ một lần và tự động tải lại

TimerHandle_t xAutoReloadTimer, xOneShotTimer;

BaseType_t xTimer1Started, xTimer2Started;

void setup()

Serial.begin(9600);

xOneShotTimer = xTimerCreate(

"OneShot",

/ * Khoảng thời gian tính bằng ms. * /

mainONE_SHOT_TIMER_PERIOD,

pdFALSE,

0,

prvOneShotTimerCallback );
xAutoReloadTimer = xTimerCreate(

"AutoReload",

mainAUTO_RELOAD_TIMER_PERIOD,

pdTRUE,

0,

prvAutoReloadTimerCallback );

if( ( xOneShotTimer != NULL ) && ( xAutoReloadTimer != NULL ) )

xTimer1Started = xTimerStart( xOneShotTimer, 0 );

xTimer2Started = xTimerStart( xAutoReloadTimer, 0 );

if( ( xTimer1Started == pdPASS ) && ( xTimer2Started == pdPASS ) )

vTaskStartScheduler();

void loop()

static void prvOneShotTimerCallback( TimerHandle_t xTimer )

TickType_t xTimeNow;

xTimeNow = xTaskGetTickCount();

Serial.print("One-shot timer callback executing ");

Serial.println(xTimeNow/31);

static void prvAutoReloadTimerCallback( TimerHandle_t xTimer )


{

TickType_t xTimeNow;

xTimeNow = xTaskGetTickCount();

Serial.print("Auto-reload timer callback executing ");

Serial.println( xTimeNow/31 );

5.TH8.3
#include <Arduino_FreeRTOS.h>

#include <timers.h>

#define mainAUTO_RELOAD_TIMER_PERIOD pdMS_TO_TICKS( 500 )

#define mainAUTO_RELOAD_TIMER_PERIOD2 pdMS_TO_TICKS( 1000 )

TimerHandle_t xAutoReloadTimer;

BaseType_t xTimer2Started;

void setup()

Serial.begin(9600); // Enable serial communication library.

xAutoReloadTimer = xTimerCreate(

"AutoReload",

mainAUTO_RELOAD_TIMER_PERIOD,

pdTRUE,

0,

prvTimerCallback);

if(( xAutoReloadTimer != NULL ) )

xTimer2Started = xTimerStart( xAutoReloadTimer, 0 );

if( ( xTimer2Started == pdPASS ) )

vTaskStartScheduler();
}

void loop()

static void prvTimerCallback( TimerHandle_t xTimer )

TickType_t xTimeNow;

uint32_t ulExecutionCount;

ulExecutionCount = ( uint32_t ) pvTimerGetTimerID( xTimer );

ulExecutionCount++;

vTimerSetTimerID( xTimer, ( void * ) ulExecutionCount );

xTimeNow = xTaskGetTickCount();

Serial.print("Auto-reload timer callback executing ");

Serial.println( xTimeNow/31 );

if( ulExecutionCount >= 5 )

xTimerChangePeriod( xAutoReloadTimer,

mainAUTO_RELOAD_TIMER_PERIOD2,

0 );

You might also like