uCos 之 TaskIdle() 注意事项【worldsing笔记】
在大多OS里都存在Idle线程或任务,同样uCos也不例外,为什么估计很少有人细研究。为什么设立Idle? 能不能去了?
首先看看uCos中关于Idle的代码做个介绍:
config.h里对Idle的配置:
#define OS_LOWEST_PRIO 7 /* 最低优先级,OS_LOWEST_PRIO即空闲任务优先级(0 ~ 63) */
#define OS_TASK_IDLE_STK_SIZE 32 /* 空闲任务栈容量 单位类型:OS_STK * */
在Core.c文件里的OSInit()调用OS_InitTaskIdle();来创建OS_TaskIdle任务,OS_InitTaskIdle();封装了
CreateTask()的不同创建方法,有带ID名,有不带ID名的。
在Core.c文件里的OS_TaskIdle线程体
void OS_TaskIdle (void *pdata)
{
#if OS_CRITICAL_METHOD == 3 /* Allocate storage for CPU status register */
OS_CPU_SR cpu_sr;
#endif
pdata = pdata; /* Prevent compiler warning for not using 'pdata' */
for (;;)
{
OS_ENTER_CRITICAL();
OSIdleCtr++;
OS_EXIT_CRITICAL();
#if OS_TASK_IDLE_HOOK_EN > 0 /* Allocate storage for CPU status register */
OSTaskIdleHook(); /* Call user definable HOOK */
#endif
}
}
- 空闲任务
- 描述:这个函数是uCOS-II内部函数,uCOS-II总要建立一个空闲任务,这个任务在没有其它任务进入
- 绪态时投入运行。这个空闲任务永远设为最低优先级,即OS_LOWEST_PRIO.空闲任务不可能 被应用软件删除。
之所以设立Idle是因为当用户任务都不行用cpu时有Idle回收,应为cpu总德有一个任务,或是有一个入口让cpu
停止工作。这种情况是在用户任务都处于挂起或是延时时,那么以uCos的调度器结构来说总有一个任务才能调度
这个任务就是Idle. 所以在Idle里不能将Idle自己挂起或是延时。否则系统将会崩溃。为了验证这个说法举例说明问题:
建立两个用户任务,统计任务不使用,加上Idle一共3个任务,3个任务同是用OSTimeDly();即所有任务都放弃CPU
连Idle也放弃。
/* 用户任务1 */
void MainTask (void *pArg)
{
OSSetupTask(Task0, 2);
while(1)
{
pArg = pArg;
OSTimeDly(50000);
}
}
/* 用户任务 */
void Task0 (void *pArg)
{
int cnt;
cnt = 0;
while(1)
{
pArg = pArg;
OSTimeDly(50000);
cnt++;
if(cnt == 100)
while(1);
}
}
OSTaskIdleHook()
{
OSTimeDly(100);
OSTimeDly(50);
}
在stm32运行是直接是HardFault伺候。
所以在uCos里Idle永远是就绪态,不要在OSTaskIdleHook()中调用可以使任务挂起的PEND函数,
Idle能不能去了?答案是可以的,但是得修改调度器的写法,其实Idle也吃内存。至少20 个字。
uCos 之 TaskIdle() 注意事项【worldsing笔记】的更多相关文章
- Keil uCos 2.52 stm32 【worldsing笔记】
1.uCOSii V2.52 a.加了7个可以配置的钩子函数宏 #define OS_TASK_CREATE_HOOK_EN 0 /* 任务创建时调用钩子函数 使能 ...
- 简单OS(ucos超级精简版)——裸调度器【worldsing笔记】
简单原则少ROM,少RAM,任务完成就让出CPU,调度器描述: 1.按最大任务数轮番调度: 2.任务调用延时接口将让出CPU使用权,进入下一个任务调度: 3.用户任务都处于延时或是不使用CPU运行Id ...
- emWin(ucGui)数值显示例程 -【worldsing笔记】
本例程下载:2.emWin5.26(ucGui)VS2008数字显示.zip 在emWin显示文本字符还是容易,我们也可以使用字符串和标准 C 库的函数来显示数值.然而,有时候这会是件困难的事.通 ...
- WS103C8例程——串口2【worldsing笔记】
在超MINI核心板 stm32F103C8最小系统板上调试Usart2功能:用Jlink 6Pin接口连接WStm32f103c8的Uart2,PC机向mcu发送数据,mcu收到数据后数据加1,回传给 ...
- OSStartHighRdy()一去不复返【worldsing笔记】
有关于uCos的启动过程讲解有很多文章,这里主要记录已下OSStartHighRdy()在stm32下是怎么写和运行的: stm32上电 运行SystemInit(): 配置时钟,这个不要也可 ...
- Keil Mdk5.0 破解包 和谐包【worldsing笔记】
有关Keil MDK 5.0的介绍和下载 http://www.cnblogs.com/worldsing/p/3355911.html 下载地址 点击下载:http://pan.baidu.com/ ...
- FreeModbus Slave 改进的eMbPoll()【worldsing 笔记】
eMbPoll()的作用是FreeMod协议通信过程中不断查询事件对列有无完速数据桢,并进行地址和CRD验证,最后运行和回复主机. 为了减小代码尺寸对eMbPoll进行改进: 原版: 1: 2: e ...
- oracle 事务处理 注意事项(笔记)
事务:一个独立的逻辑工作单元.它有特定的一系列必须作为一个整体一起成功或者失败的SQL语句组成.是一个要么全有要么全无,很个性的一个东东. 事务的四大属性——ACID属性:原子性(atomicity) ...
- QTbaWidget控件几个例程 【worldsing笔记】
Qt Creator自带的 QTabWidget控件几个例程 在Qt Windos版本安装后,在Example目录可以找到与QTabWidget相关的工程Demo,如果按默认安装的话他们分别是: ...
随机推荐
- 查看使用的Eclipse版本
第一种方法 1. 找到Eclipse的解压目录就是你的Eclipse.exe 所在的目录 2. 找到 .eclipseproduct 文件双击打开
- Linux命令面试常考的简单汇总
1.显示日期与时间的命令:date 2.显示日历的命令:cal 3.简单好用的计算器:bc 4.热键“命令补全或文件补齐”:Tab 5.热键“中断目前程序”:Ctrl+C 6.热键“键盘输入结束(En ...
- Linux 下shell显示-bash-4.1$不显示用户名路径的解决方法
Linux CentOS下shell显示-bash-4.1$不显示用户名路径的解决方法 问题描述: CentOS下新增一个用户,登录进去之后shell脚本的信息如下: 而不是我们经常看 ...
- PHP集成支付宝快速实现充值功能
http://blog.lixiphp.com/php-alipay-fast-chongzhi/#axzz2tOypIl4r
- while ((ch = getchar()) != EOF)中ch定义为char还是int型?cin、scanf等如何结束键盘输入
2013-07-09 18:55:42 EOF是文件的结束符,具体可以作为文本文件的结束符,也可以作为键盘输入char类型数据时的结束符.对于不同的系统,EOF的定义可能不同,一般定义为-1.因为ch ...
- I2C I2S SPDIF
I2C总线 大多数是用于电视机等家用电器的(显卡与显示器之间的通讯也是)I2S: I2S(Inter—IC Sound)总线, 又称 集成电路内置音频总线,是飞利浦公司为数字音频设备之间的音频数据传输 ...
- R12 - OM改进了对成本与收入确认的流程
我们知道在企业经营活动中,根据财务制度的要求,对于收入与成本确认有很复杂的原则,这里就不去细讨论这些原则了,要了解的话可以看纵横四海的BLOG: 中也有,但11中是灰的. 这个科目什么时候发挥作用呢? ...
- 1136. Parliament(二叉树)
1136 先由后左 再父 建一个二叉树 #include <iostream> #include<cstdio> #include<cstring> #includ ...
- Shell Script Tutorials (0 ~ 62)
Tutorial-1: Introduction Tutorial-2: Shell, Kernel, Terminal & More Tutorial-3: View System Date ...
- 如何将DataTable转换成List<T>呢?
昨日在工作中,遇到一个问题:需要将查询出来的DataTable数据源,转换成List<T>的泛型集合(已知T类型).第一反应,我想肯定要用到“泛型”(这不是废话吗?都说了要转换成List& ...