打开APP
userphoto
未登录

开通VIP,畅享免费电子书等14项超值服

开通VIP
uCOS-II无法启动多任务
uCOS-II无法启动多任务,否则死机(硬件错误死循环)
(2012-08-06 23:47:37)
转载▼
标签: 教育
分类: uCOS-II移植STM32
自己的问题解决方法:
出现上述问题,包括其他类似死机的问题时,请先检查堆栈是否太小,这是最常出现的问题!
#define Task_StkSize          256
以上为任务堆栈大小宏定义,注意堆栈的定义变量是OS_STK,在<OS_CPU.h>中定义,注意此处定义的数量大小并不一定是字节数,一般是与cpu的位宽相对应。因为是主要用来保存cpu的寄存器数据用的。
typedef unsigned int   OS_STK;
例如在32位机:int是4 byte
在16位机:int是2 byte
<以下来自百度知道>
ucos无法运行多个任务的原因,请检查一下原因:
存在4个问题,修改就可以了
(1)主要是在OSStart();前面缺少下列语句,系统老的时钟中断无任务切换功能:
OS_ENTER_CRITICAL();
PC_VectSet(0x08, OSTickISR);
PC_SetTickRate(OS_TICKS_PER_SEC);
OS_EXIT_CRITICAL();
由于ST的固件版本一直在更新,所以上面的代码仅作参考,只要明白代码所要表达的意思即可。
在firmware 版本v3.5的函数中实现的代码如下:
void  OS_CPU_SysTickInit (void)
{
RCC_ClocksTypeDef  rcc_clocks;
// 获取系统频率
RCC_GetClocksFreq(&rcc_clocks);
// 配置HCLK作为SysTick时钟
SysTick_CLKSourceConfig(SysTick_CLKSource_HCLK);
if (SysTick_Config((rcc_clocks.HCLK_Frequency / OS_TICKS_PER_SEC) - 1)) //SysTick配置函数
{
while (1);
}
}
(2)printf()是DOS服务,不可重入,必须改成可重入的函数,如PC_DispStr()函数,或者写为
OS_ENTER_CRITICAL();
printf("this is App_one,prio=10,Delay 6 second and start again\n\n");
OS_EXIT_CRITICAL();
等就可以了。原来的系统自带的那几个test程序,就都没有使用printf()函数。
这个一定要注意。
大部分都是错在这个地方。调用系统函数的时候一定要搞清楚所调用的函数的功能和特性。
(3)另外OSTimeDlyHMSM(0,0,0,3000)是不允许的,要写为OSTimeDlyHMSM(0,0,3,0);
否则认为OSTimeDlyHMSM()参数无效而忽略,任务App_one不延时而长期循环,不切换。
低级错误,不允许出现!
(4)因为prio=10,20,30,所以OS_CFG.H中要至少定义
#define OS_LOWEST_PRIO           32
否则某些低优先级任务被认为无效,不参与切换。
在os配置中注意设置。
本站仅提供存储服务,所有内容均由用户发布,如发现有害或侵权内容,请点击举报
打开APP,阅读全文并永久保存 查看更多类似文章
猜你喜欢
类似文章
Qsys与uC/OS-II学习笔记4:任务状态与工作机制
STM32 入门教程 系统时钟 SysTick
stm32上最方便的定时器Systick[操作寄存器+库函数] -Changing's Blog
stm32CubeMX HAL库中延时的几种方式解析
STemWin移植
嵌入式大杂烩周记 | 第 4 期
更多类似文章 >>
生活服务
热点新闻
分享 收藏 导长图 关注 下载文章
绑定账号成功
后续可登录账号畅享VIP特权!
如果VIP功能使用有故障,
可点击这里联系客服!

联系客服