我在rtconfig.h 配置如下:
我的测试样例:
的
问题:
我测试结果发现软件定时器无任何反应。但是如果不选上RT_TIMER_FLAG_SOFT_TIMER 定时可以正常,通过定位之后发现rt_system_timer_thread_init —》rt_thread_timer_entry这个线程无法正常切换。后来我修改RT_TIMER_THREAD_PRIO加大,当大于RT_MAIN_THREAD_PRIORITY的值时,rt_thread_timer_entry这个线程能正常跑起来,但是系统的其他线程都不正常了,为什么?
我总结下问题:
1、使用文中示例代码测试,定时器没反应
2、文中示例代码去掉RT_TIMER_FLAG_SOFT_TIMER,就正常了
3、RT_TIMER_THREAD_PRIO 大于 RT_MAIN_THREAD_PRIORITY 时候,系统其它线程不正常
楼主在系统中创建了几个定时器?
rt_system_timer_init();和 rt_system_timer_thread_init();同时初始化这两个
测试的话只创建一个
@EEZK_1546
这两个函数是你自己在应用层调用了?
rt_system_timer_init();和 rt_system_timer_thread_init();
@yangjie 是的。我发现问题原因了,但是不知道怎么解决:首先timer的优先级时最高的,那么在调用rt_system_scheduler_start时候会先获取优先级最高的线程,然后执行rt_hw_context_switch_to
在这过程中我们lr寄存器保存的是rt_thread_exit地址,所以在出栈的时候,就直接执行rt_thread_exit函数,这既是造成了timer线程马上退出来。
@EEZK_1546 这两个函数,系统中已经调用过了,不需要自己调用。自己再次调用的话,可能会有问题
我没有去调用,本身在
这个函数里面调用的
@EEZK_1546 怎么看起来像是直接把 lr 里的值直接放到了 PC 里一样