从FreeRTOS移植而来软件定时器,可用于没有跑系统的单片机中
介绍从FreeRTOS移植而来软件定时器,所有接口和FreeRTOS一致,可用于没有跑系统的单片机中
如何使用
下面给出一个使用的示例。其中dk_timer_task()方法可以放置在主循环中,也可以放置在滴答定时器中断里。如果放在主循环中,滴答定时器中断非必须,只要能提供一个计数器即可
#include "dk_soft_timer.h"
static uint32_t s_TickCount = 0;
//滴答定时器中断
void SysTick_Handler(void) {
s_TickCount++;
//软件定时器任务,可以放在主循环或者滴答定时器中断中。最终定时器的回调是在dk_timer_task调用的地方执行的。
// dk_timer_task();
}
uint32_t sys_get_tick_count(void) {
return s_TickCount;
}
//定时器回调,和FreeRTOS一样
static void s_time_callback( TimerHandle_t xTimer ) {
printf("hello world!\r\n");
}
int main() {
//初始化滴答定时器1ms节拍
SysTick_Config(GetSysClock() / 1000);
//软件定时器初始化
dk_soft_timer_init(&sys_get_tick_count);
//初始化一个软件定时器,和FreeRTOS一样使用
xTimerHandle timer_handle = xTimerCreate("timer_handle", 10000, pdTRUE, (void *)0, s_time_callback);
if (timer_handle != NULL) {
xTimerStart( timer_handle, 0 );
}
while (1) {
//软件定时器任务,可以放在主循环或者滴答定时器中断中。最终定时器的回调是在dk_timer_task调用的地方执行的。
dk_timer_task();
}
}
国学芯用 发表于 2023-6-30 15:59
(引用自2楼)
??????? 这个点子不错,用裸奔系统的定时器或者大循环代替原来的定时任务 不错,关注。 最新的代码,修复了定时器无法停止的问题
先点个赞不错!
但若是裸机跑,还是感觉是还是复杂化了,相比较而言,个人还是比较推崇 那个"小小调度器";
同时也喜欢用,同样是基于systick的1ms计数器主线的(g_u32SystickCounter相当于一个伪时间戳), 在while大循环里 直接查询判断DelayTimeOut(&TimerID, 100),执行相应任务,简单清晰明了
foxpro2005 发表于 2023-7-4 21:55
先点个赞不错!
但若是裸机跑,还是感觉是还是复杂化了,相比较而言,个人还是比较推崇 那个"小小调度器";
...
(引用自7楼)
看了下小小调度器,不得不说确实精妙,有用的知识又增加了,哈哈哈 中国移动OneOS的软件定时器,能不能剥离操作系统单独移植?
页:
[1]