ora 20000 upgrade not:STM32下Uc/os-II多任务编写方法

来源:百度文库 编辑:偶看新闻 时间:2024/04/29 20:44:57

任务调用了OSSchedLock()函数后,决不能再调用可能导致当前任务挂起的系统函数:OSTimeDly(),OSTimeDlyHMSM(),OSSemPend(),OSMboxPend(),OSQPend()。因为任务调度已经被禁止,其他任务不能运行,这会导致系统死锁。

一、os的时钟节拍可用定时器来产生 如 system_tick定时器,一般频率设为10-100Hz,频率过高会加重cpu的负担时钟节拍的实际频率取决于用户应用程序的精度。时钟节拍源可以是任何的硬件定时器,如果没定时器,可以考虑采50/60Hz交流电源的同步信号根据system_tick定时器频率修改:os_cfg.h中#define OS_TICKS_PER_SEC 100二、任务的执行代码通常写成一个超循环结构(对于一次性任务不这样) void mytask(void *pdata) {  变量、常量定义  for (;;) {    可以被中断的用户代码    OS_ENTER_CRITICAL();  不可以被中断的用户代码  OS_EXIT_CRITICAL();  可以被中断的用户代码 } }三、主函数一般格式:  int mian(void)  {  初始化系统硬件  OSInit(); //os初始化  ……………………  建立任务 ,消息机制的建立  OSStart();//启动os  ……………………  }  注意:一定不要在 OSStart();之前 开中断(包括系统节拍中断 ).这里潜在地危险是,时钟节拍中断有可能在μC/OS-Ⅱ启动第一个任务之前发生,此时μC/OS-Ⅱ是处在一种不确定的状态之中,用户应用程序有可能会崩溃。  一般的做法是 :在最高优先级任务的开始 打开中断(for(;;)之前)或 专门建一个最高优先级的任务任务来打开 所有中断,然后挂起这个任务或删除它使之永远不再运行四、进入中断服务程序后要调用 OSIntEnter() and OSIntExit() 告诉os我们在做中断服务  eg:  void TIM2_IRQHandler(void)  {  //通知uC/OS-II我们要做中断服务了  OSIntEnter();  if(TIM_GetITStatus(TIM2,TIM_IT_Update)!=RESET)  {  TIM_ClearITPendingBit(TIM2,TIM_IT_Update);  }  //通知uC/OS-II 我们要离开中断服务了  OSIntExit();  }
本文来自: 高校自动化网(Www.zdh1909.com) 详细出处参考(转载请保留本链接):http://www.zdh1909.com/html/stm32/10910_2.html