找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 6892|回复: 0
打印 上一主题 下一主题
收起左侧

uC/OS-II,不能运行多任务

[复制链接]
跳转到指定楼层
楼主
ID:82083 发表于 2015-6-9 00:19 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
                        ucos无法运行多个任务的原因,检查原因:
存在5个问题,修改就可以了
(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 startagain\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配置中注意设置。

(5)高优先级任务一直占着CPU,低优先级任务得不到执行。每个任务都要释放一下CPU,在任务中加入一个系统延时函数就好了。


分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖 顶 踩

相关帖子

回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表