1 首先看函数:
1.1 当使用ucos时才有以下部分:
主要实现宏定义与基本函数定义。
<p>
</p><p>#if SYSTEM_SUPPORT_OS<span style="white-space:pre"> </span>//如果SYSTEM_SUPPORT_OS定义了,说明要支持OS了(不限于UCOS).</p><p>//当delay_us/delay_ms需要支持OS的时候需要三个与OS相关的宏定义和函数来支持</p><p>//首先是3个宏定义:</p><p>// delay_osrunning:用于表示OS当前是否正在运行,以决定是否可以使用相关函数</p><p>//delay_ostickspersec:用于表示OS设定的时钟节拍,delay_init将根据这个参数来初始哈systick</p><p>// delay_osintnesting:用于表示OS中断嵌套级别,因为中断里面不可以调度,delay_ms使用该参数来决定如何运行</p><p>//然后是3个函数:</p><p>// delay_osschedlock:用于锁定OS任务调度,禁止调度</p><p>//delay_osschedunlock:用于解锁OS任务调度,重新开启调度</p><p>// delay_ostimedly:用于OS延时,可以引起任务调度.</p><p>
</p><p>//本例程仅作UCOSII和UCOSIII的支持,其他OS,请自行参考着移植</p><p>//支持UCOSII</p><p>#ifdef <span style="white-space:pre"> </span>OS_CRITICAL_METHOD<span style="white-space:pre"> </span>//OS_CRITICAL_METHOD定义了,说明要支持UCOSII<span style="white-space:pre"> </span></p><p>#define delay_osrunning<span style="white-space:pre"> </span>OSRunning<span style="white-space:pre"> </span>//OS是否运行标记,0,不运行;1,在运行</p><p>#define delay_ostickspersec<span style="white-space:pre"> </span>OS_TICKS_PER_SEC<span style="white-space:pre"> </span>//OS时钟节拍,即每秒调度次数</p><p>#define delay_osintnesting <span style="white-space:pre"> </span>OSIntNesting<span style="white-space:pre"> </span>//中断嵌套级别,即中断嵌套次数</p><p>#endif</p><p>
</p><p>//支持UCOSIII</p><p>#ifdef <span style="white-space:pre"> </span>CPU_CFG_CRITICAL_METHOD<span style="white-space:pre"> </span>//CPU_CFG_CRITICAL_METHOD定义了,说明要支持UCOSIII<span style="white-space:pre"> </span></p><p>#define delay_osrunning<span style="white-space:pre"> </span>OSRunning<span style="white-space:pre"> </span>//OS是否运行标记,0,不运行;1,在运行</p><p>#define delay_ostickspersec<span style="white-space:pre"> </span>OSCfg_TickRate_Hz<span style="white-space:pre"> </span>//OS时钟节拍,即每秒调度次数</p><p>#define delay_osintnesting <span style="white-space:pre"> </span>OSIntNestingCtr<span style="white-space:pre"> </span>//中断嵌套级别,即中断嵌套次数</p><p>#endif</p><p>
</p><p>
</p><p>//us级延时时,关闭任务调度(防止打断us级延迟)</p><p>void delay_osschedlock(void)</p><p>{</p><p>#ifdef CPU_CFG_CRITICAL_METHOD <span style="white-space:pre"> </span>//使用UCOSIII</p><p><span style="white-space:pre"> </span>OS_ERR err; </p><p><span style="white-space:pre"> </span>OSSchedLock(&err);<span style="white-space:pre"> </span>//UCOSIII的方式,禁止调度,防止打断us延时</p><p>#else<span style="white-space:pre"> </span>//否则UCOSII</p><p><span style="white-space:pre"> </span>OSSchedLock();<span style="white-space:pre"> </span>//UCOSII的方式,禁止调度,防止打断us延时</p><p>#endif</p><p>}</p><p>
</p><p>//us级延时时,恢复任务调度</p><p>void delay_osschedunlock(void)</p><p>{<span style="white-space:pre"> </span></p><p>#ifdef CPU_CFG_CRITICAL_METHOD <span style="white-space:pre"> </span>//使用UCOSIII</p><p><span style="white-space:pre"> </span>OS_ERR err; </p><p><span style="white-space:pre"> </span>OSSchedUnlock(&err);<span style="white-space:pre"> </span>//UCOSIII的方式,恢复调度</p><p>#else<span style="white-space:pre"> </span>//否则UCOSII</p><p><span style="white-space:pre"> </span>OSSchedUnlock();<span style="white-space:pre"> </span>//UCOSII的方式,恢复调度</p><p>#endif</p><p>}</p><p>
</p><p>//调用OS自带的延时函数延时</p><p>//ticks:延时的节拍数</p><p>void delay_ostimedly(u32 ticks)</p><p>{</p><p>#ifdef CPU_CFG_CRITICAL_METHOD</p><p><span style="white-space:pre"> </span>OS_ERR err; </p><p><span style="white-space:pre"> </span>OSTimeDly(ticks,OS_OPT_TIME_PERIODIC,&err);<span style="white-space:pre"> </span>//UCOSIII延时采用周期模式</p><p>#else</p><p><span style="white-space:pre"> </span>OSTimeDly(ticks);<span style="white-space:pre"> </span>//UCOSII延时</p><p>#endif </p><p>}</p><p> </p><p>//systick中断服务函数,使用ucos时用到</p><p>void SysTick_Handler(void)</p><p>{<span style="white-space:pre"> </span></p><p><span style="white-space:pre"> </span>if(delay_osrunning==1)<span style="white-space:pre"> </span>//OS开始跑了,才执行正常的调度处理</p><p><span style="white-space:pre"> </span>{</p><p><span style="white-space:pre"> </span>OSIntEnter();<span style="white-space:pre"> </span>//进入中断</p><p><span style="white-space:pre"> </span>OSTimeTick(); <span style="white-space:pre"> </span>//调用ucos的时钟服务程序 </p><p><span style="white-space:pre"> </span>OSIntExit(); <span style="white-space:pre"> </span> <span style="white-space:pre"> </span>//触发任务切换软中断</p><p><span style="white-space:pre"> </span>}</p><p>}</p><p>#endif</p><div>
</div>
|