AK Embedded Base Kit - STM32L151 - Event Driven: Timer

Trong phát triển ứng dụng nói chung và hệ thống nhúng nói riêng, việc xử lý theo thời gian là nhu cầu diễn ra rất thường xuyên, ví dụ:

- Bạn vừa điều khiển bật máy lạnh bằng IR, và sau khoản thời gian 2 giây, bạn cần kiểm tra cảm biến đo dòng có đo được dòng điện hay không, để xác nhận là máy lạnh đã được bật, nếu dòng điện chưa có, bạn sẽ retry bật thêm lần nữa.

- Trong network, bạn vừa gửi đi một gói tin, nếu trong khoản thời gian Time-Out nếu chưa nhận được gói ACK bạn sẽ try gửi lại một lần nữa.

- Đọc dữ liệu cảm biến mỗi 5 giây.

- Clear counter watchdog mỗi 1 giây.

 

AK Embedded Base Kit - STM32L151 - Event Driven: Timer

 

Hầu hết các hệ thống event-driven đều hỗ trợ service timer, timer trên các hệ thống này rất dễ dùng và rất tiện lợi. Tất nhiên, sự tiện lợi này là do cách mà event-driven hứng và xử lý các sự kiện (event).

 

Bên dưới là task_life để xử lý clear watchdog:

void task_life(ak_msg_t* msg) {
    switch (msg->sig) {
    case AC_LIFE_SYSTEM_CHECK:
        /* reset watchdog */
        sys_ctrl_independent_watchdog_reset();
        sys_ctrl_soft_watchdog_reset();

#if defined(AK_IO_IRQ_ANALYZER)
#else
        /* toggle led indicator */
        led_toggle(&led_life);
#endif
        break;

    default:
        break;
    }
}

 

Signal AC_LIFE_SYSTEM_CHECK xử lý việc clear watchdog.

Hệ thống event-drivent cần gửi Signal AC_LIFE_SYSTEM_CHECK vào task_life mỗi 1 giây để ứng dụng clear watchdog counter, bên dưới là cách ứng dụng làm được việc đó, hàm timer_set được gọi bất kì đâu để tạo một timer bắn Signal vào Task. Nếu các bạn chưa rõ về Task và Signal thì đọc bài viết này: AK Embedded Base Kit - STM32L151 - Event Driven: Task & Signal

 

timer_set(AC_TASK_LIFE_ID, AC_LIFE_SYSTEM_CHECK, AC_LIFE_TASK_TIMER_LED_LIFE_INTERVAL, TIMER_PERIODIC)

Link source code: https://github.com/epcbtech/ak-base-kit-stm32l151/blob/main/application/sources/app/app.cpp

 

Cách sử dụng hàm timer_set:

uint8_t timer_set(task_id_t des_task_id\ /* Task đích, trong ví du trên là: AC_TASK_LIFE_ID*/
, timer_sig_t sig\ /* Signal trong Task đích, trong ví dụ trên là: AC_LIFE_SYSTEM_CHECK*/
, uint32_t duty\ /* Thời gian đơn vị là ms, trong ví dụ trên là: 1000 ms*/
, timer_type_t type);

/* Có 2 loại timer:\
1. TIMER_ONE_SHOT: Chỉ bắn Signal 1 lần vào task sau khoản thời gian duty \
2. TIMER_PERIODIC: Bắn Signal định kì sau mỗi khoản thời gian duty \
*/

Link source code: https://github.com/epcbtech/ak-base-kit-stm32l151/blob/main/application/sources/ak/inc/timer.h

 

Trong trường hợp bạn muốn dừng timer (sau khi đã gọi hàm timer_set), bạn chỉ gọi timer_remove_attr để clear timer đã cài:

 

uint8_t timer_remove_attr(task_id_t des_task_id \ /* Task đích, trong ví du trên là: AC_TASK_LIFE_ID*/
, timer_sig_t sig); /* Signal trong Task đích, trong ví dụ trên là: AC_LIFE_SYSTEM_CHECK*/

 

Như vậy chỉ với 2 hàm timer_set, và timer_remove_attr, bạn đã điều khiển hầu hết các nhu cầu về thời gian trong ứng dụng của mình.

 

Nếu trong quá trình thao tác có phát sinh các lỗi hoặc các thắc mắc, các bạn thông tin về EPCB theo các kênh sau nhé !

 

Bình luận