天狼的学习与思考 https://bbs.21ic.com/?540120 [收藏] [复制] [RSS] 记录我学习过程中的点点滴滴

日志

stm32 下ucoc—II多任务:日历、软件i2c温度、信号量、邮箱

已有 2748 次阅读2010-4-28 12:56 |系统分类:ARM| stm32, usosII, i2c, 信号量, 邮箱

学了一阵ucos—ii,写了几个任务 ,加上信号量,邮箱,做个简单的系统。用到 usart 、i2c、数码管 、lcd(显示信息)。


 


发现在stm32下 如果中断嵌套的话,ucos 会死,所以nvic里优先级只能设为一样的。


stm32 的i2c真的很难用,还是用io来模拟吧,前段时间自己在avr下写的软件模拟 i2c的程序刚好用上,用这个调试很快成功了。


下面是自己的总结:


* 可以再vector.s中 把 栈 和 堆取大点


* os的时钟节拍可用定时器来产生 如 system_tick定时器,一般频率设为10-100Hz,频率过高会加重cpu的负担
 时钟节拍的实际频率取决于用户应用程序的精度。时钟节拍源可以是任何的硬件定时器,如果没定时器,可以
 考虑采50/60Hz交流电源的同步信号
 
 根据system_tick定时器频率修改:
 os_cfg.h中
 #define OS_TICKS_PER_SEC        100


* 在ucos中 加入两个中断 ,中断优先级一样的时候系统正常,当优先级不同产生中断嵌套时,系统会死机,不
 知道怎么回事?


 


* 任务的执行代码通常写成一个超循环结构
 (对于一次性任务不这样)
 eg:
 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();
}


* 事件要在 使用(发送,请求)之前建立



* stm32 的 i2c库 真的很难用
 i2c 就用 gpio 来模拟了


工程源代码:


ucosII信号量,邮箱.rar


路过

鸡蛋

鲜花

握手

雷人

评论 (0 个评论)