完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
请问在调用rt_enter_critical()进入临界区后,通过rt_timer_create创建的定时器是否还在运行呢?在文档里看到默认创建的是硬件定时器,此时进入临界区后定时器超时函数应该还能执行吧,但是如果通过RT_TIMER_FLAG_SOFT_TIMER设置为软件定时器的话,文档中说会创建一个timer线程,此时rt_enter_critical()之后停止线程调度,timer线程应该不会执行了吧,但是实测的话定时器还是可以正常执行超时函数 |
|
相关推荐
3个回答
|
|
|
|
|
|
但是实际测试中,就算设置为软件定时器,还是一样会执行超时函数,是我哪里设置错了吗,代码如下 #include "sys.h" #include "rtthread.h" #include rt_timer_t One_Sec_Timer; rt_thread_t Test_thread; void mdelay_ms(uint32_t ms) { uint32_t time = rt_tick_get(); while(rt_tick_get() - time < ms){} } static void One_Sec_TimeOut(void *parameter) { rt_kprintf("1srn"); } static void Test_thread_entry(void* params) { while(1) { rt_enter_critical(); rt_kprintf("ENTERrn"); mdelay_ms(5000); rt_exit_critical(); rt_kprintf("EXITrn"); rt_thread_mdelay(5000); } } int thread(void) { Test_thread = rt_thread_create("Test_thread", Test_thread_entry, RT_NULL, 128, 15, 15); if(Test_thread != RT_NULL) rt_thread_startup(Test_thread); return 0; } int main(void) { thread(); One_Sec_Timer = rt_timer_create("One_Sec_Timer", One_Sec_TimeOut, RT_NULL, 1000, RT_TIMER_FLAG_SOFT_TIMER | RT_TIMER_FLAG_PERIODIC); if(One_Sec_Timer != RT_NULL) { rt_timer_start(One_Sec_Timer); rt_kprintf("One_Sec_Timer create successrn"); } } 运行结果如图 ![]() |
|
|
|
已解决,忘记在rtconfig中开启软件定时器相关宏定义
|
|
|
|
你正在撰写答案
如果你是对答案或其他答案精选点评或询问,请使用“评论”功能。
IaaS+on+DPU(IoD)+下一代高性能算力底座技术白皮书
1302 浏览 0 评论
飞凌嵌入式-ELFBOARD 常用的USB接口及其不同版本介绍第1期
1021 浏览 0 评论
【Vision Board创客营连载体验】RA8D1-Vision Board上OSPI-Flash实践
1468 浏览 0 评论
I.MX6ULL-飞凌 ElfBoard ELF1板卡- 应用层更改引脚复用的方法
3710 浏览 0 评论
1888 浏览 0 评论
64013 浏览 21 评论
297217 浏览 82 评论
嵌入式热门DIY项目:智能机器人开源资料合集(原理图、代码、论文)
67065 浏览 20 评论
57034 浏览 32 评论
小黑屋| 手机版| Archiver| 电子发烧友 ( 湘ICP备2023018690号 )
GMT+8, 2024-8-6 18:17 , Processed in 0.661122 second(s), Total 78, Slave 58 queries .
Powered by 电子发烧友网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
电子发烧友观察
版权所有 © 湖南华秋数字科技有限公司
电子发烧友 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191