||
学了一阵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 来模拟了
工程源代码: