大概rtthread觉得直接等待的阻塞延时效率不够高,逻辑不够优美;所以它给每个thread都配置了一个rt_timer类型的thread_timer定时器; 所有定时器由定时器链表统一管理,通过对thread_timer定时器统一管理多个线程的延时,效率高,逻辑优美; 2.1 定时器结构体 //rtdef.h #defineRT_TIMER_FLAG_DEACTI...
/*rtconfig.h*///<e>Software timers Configuration//<i> Enables user timers#defineRT_USING_TIMER_SOFT 0#ifRT_USING_TIMER_SOFT == 0#undefRT_USING_TIMER_SOFT#endif//<o>The priority level of timer thread <0-31>//<i>Default: 4#defineRT_TIMER_THREAD_PRIO 4//<o>The stack size of tim...
定时器线程的堆栈大小默认为RT_TIMER_THREAD_STACK_SIZE,512个字节。 11.5.定时器超时函数¶ 定时器最主要的目的是在经过指定的定时时间后,系统能够自动执行用户设定的动作,也就是超时函数。该函数在创 建定时器的时候需要用户自己定义,并且编写对应的执行代码。
#define RT_USING_TIMER_SOFT 0 // 关闭软件定时器功能,为 1 则打开 #if RT_USING_TIMER_SOFT == 0 #undef RT_USING_TIMER_SOFT #endif #define RT_TIMER_THREAD_PRIO 4 // 设置软件定时器线程的优先级,默认为 4 #define RT_TIMER_THREAD_STACK_SIZE 512 // 设置软件定时器线程的栈大小,默认为 512...
struct rt_timer thread_timer; /**< built-in thread timer */ void (*cleanup)(struct rt_thread *tid); /**< cleanup function when thread exit */ /* light weight process if present */ #ifdef RT_USING_LWP void *lwp; #endif rt_uint32_t user_data; /**< private user data beyond th...
rt_system_timer_thread_init(); /* idle thread initialization */ rt_thread_idle_init(); #ifdef RT_USING_SMP rt_hw_spin_lock(&_cpus_lock); #endif /* RT_USING_SMP */ /* start scheduler */ rt_system_scheduler_start(); /* never reach here */ ...
根据定时器超时函数执行时所处的上下文环境,RT-Thread的定时器可以分为HARD_TIMER模式和SOFT_TIMER模式。 HARD_TIMER模式:中断上下文 定时器超时函数的要求:执行时间应该尽量短,执行时不应导致当前上下文挂起、等待。例如在中断上下文中执行的超时函数它不应该试图去申请动态内存、释放动态内存等 ...
&timer_thread_stack[0], sizeof(timer_thread_stack), RT_TIMER_THREAD_PRIO, 10); /* startup */ rt_thread_startup(&timer_thread); #endif } 软件定时器线程如下: /* system timer thread entry */ static void rt_thread_timer_entry(void *parameter) ...
rt_ubase_t init_tick;/* 线程初始化计数值 */rt_ubase_t remaining_tick;/* 线程剩余计数值 */struct rt_timer thread_timer;/* 内置线程定时器 */void(*cleanup)(struct rt_thread*tid);/* 线程退出清除函数 */rt_uint32_t user_data;/* 用户数据 */}; ...
stack_start=(void*)RT_KERNEL_MALLOC(stack_size); 大小由用户给定,最后返回的时线程栈的起始地址。 然后初始化线程: _rt_thread_init(thread,name,entry,parameter,stack_start,stack_size,priority,tick); 进入函数原型: static rt_err_t_rt_thread_init(struct rt_thread*thread,const char*name,void(*ent...