随笔 - 733  文章 - 2  评论 - 12  阅读 - 92万

UCOS时钟与中断:

OSTimeDly()

OSTimeDlyHMSM()上面的函数除了延时功能,主要是会进入任务调度。

OSTimeDlyHResume()当某条件达到之后需要停止周期性延时调用该函数。

当调用延时函数时,系统进行任务切换调度,并给任务的任务控制块参数OSTCBDly赋延时值。

周期性时钟节拍中断服务函数OSTickISR()进行周期计时的同时调用OSTimTick()函数(遍历所有的任务控制块并将其参数OSTCBDly减一,并判断如果减到0则让其进入就绪状态)。 任务CPU使用权的剥夺和准确恢复是利用任务控制块(保存其切换前后的信息),OSTimTick()又调用了OSTimTickHOOK()钩子函数(用户可增加些自己的操作)

1时钟的中断处理函数:OSTICKISR() //其调用ostimetick(),

2ucosii时钟节拍10~100HZ,且在OSSTART之后开启时钟节拍。每个时钟节拍后,时钟中断函数将计时器加1,同时遍历所有延时的任务函数块将其延时减一,并使延时到的任务进入就绪。

3任务延时:UCOSII规定:除空闲任务外的任何任务都要调用一次延时函数,以进行一次任务调度,让出CPU使用权

4获得和设置系统时间:在OSSTART之后启动每个时钟节拍增一通过函数好可获得和重置改在、时间。

中断与屏蔽中断:进入临界区有三种方法(取决于处理器和编译器,由用户采用汇编实现),可保护代码不被中断。注意在临界区禁止使用系统函数,以免系统崩溃。中断函数常用产生一个信号量来激活其它任务的运行来实现同步通讯。进入和退出中断调用系统函数OSITEnter()和OSItEXIT(),前者将中断嵌套数加1,后者减一,且要判断:如果嵌套层数为1,调度器未上锁且当前最高优先级不是当前任务时则执行一次调度OSIntCtxSw().因为剥夺型内核在退出中断时的返回地址不一定是进入中断前的地址,如果退出前地址的任务在退出时不是最高优先级的话。

posted on   杰瑞鼠  阅读(594)  评论(0编辑  收藏  举报
编辑推荐:
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
阅读排行:
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· Manus的开源复刻OpenManus初探
· AI 智能体引爆开源社区「GitHub 热点速览」
· 三行代码完成国际化适配,妙~啊~
· .NET Core 中如何实现缓存的预热?
< 2025年3月 >
23 24 25 26 27 28 1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28 29
30 31 1 2 3 4 5

点击右上角即可分享
微信分享提示