本文是《嵌入式实时操作系统ucosii原理及应用(任哲)》一书第三章的阅读笔记,知识点多为摘录,若希望深入了解,请购买该书认真研读。由于一些知识比较零散,记起来不大方便,又习惯画图辅助记忆,刚好想起一款比较好用的思维导图,就顺手拿来用一用了(绝非打广告),导图中包含部分备注。

脑图链接及密码:http://naotu.baidu.com/file/c550d674fa54bd29588c31c5bd682f4f?token=8e71f5732699f4b6 密码: v6um

可以看出:A)任务必须先从睡眠状态进入就绪状态,才能在合适的时机被运行;B)只能从运行状态进入中断服务状态;C)只能从运行状态进入等待状态。

前面一章我们已经讲过:大多数任务(尤其是用户任务)是一个无限循环结构,在这个循环中,系统响应中断请求,进入中断服务函数进行其他操作。但是,有时任务中的一些操作是不允许被中断打断的,为此,我们可以在任务函数程序代码中添加关中断函数和开中断函数,则在这两个函数之间的代码,执行过程不会被打断,该段代码称为临界段。ucosii中用两个宏:OS_ENTER_CRITICAL( )、OS_EXIT_CRATICAL( )分别实现关中断和开中段。从程序设计角度看,一个ucosii任务的代码就是一个C语言函数,为了可以传递各种不同类型的数据甚至是函数,ucosii把任务参数定义成了一个void类型的指针。

用户应用程序的一般结构:

在ucosii中,main函数与任务函数的地位是平等的,虽然任务是在main函数中初始化的,但是任务和main的运行与中断是由操作系统调度的,也就是说,作为程序运行的入口函数,main函数必须完成操作系统的初始化、任务的创建、操作系统的启动,最后把系统的调度权交回给操作系统。

void MyTask1(void *pdata)

{
for( ; ; )
{
//这上面的代码执行时可以被打断
OS_ENTER_CRITICAL( );
//临界段
//这中间执行的代码不可以被打断
OS_ENTER_CRITICAL( );
}
}
void MyTask2(void *pdata)
{
for( ; ; )
{
//这上面的代码执行时可以被打断
OS_ENTER_CRITICAL( );
//临界段
//这中间执行的代码不可以被打断
OS_ENTER_CRITICAL( );
}
}
void main(void)
{
OS_Init( );

OSTaskCreate(MyTask1,...);
OSTaskCreate(MyTask2,...);

OS_Start( );
}

操作系统运行时,一定有某段时间处于空闲状态,但是CPU是不可以停下来的,除非断电。为此,ucosii定义了两个系统任务:空闲任务和统计任务。空闲任务是用户应用程序必须使用的,统计任务是用户程序可选择使用的。

//操作系统定义的空闲任务

void OS_TaskIdle(void *pdata)
{
#if(OS_CRITICAL_METHOD == 3)
OS_CPU_SR cpu_sr;
#endif

//部分C编译器会对定义了却没有使用的变量报错
pdata = pdata;

for( ; ; )
{
OS_ENTER_CRITICAL( );
OSIdleCtr++; //记录空闲任务运行次数
OS_EXIT_CRITICAL( );

//一般还会加上下面这个函数,用户可以在该函数中写用户希望执行的代码
//一般函数内写的是让CPU进入低功耗模式的指令
//该函数总是处于就绪状态的
OSTaskIdleHook( );
}
}

至于统计任务,该任务每秒计算一次CPU在单位时间内被使用的时间,并把计算结果以百分比的形式存放在变量OSCPUsage中,从而使得应用程序可以了解CPU的利用率。

当不同任务同时需要运行时,系统利用优先级判断哪个先执行,由于大多数情况下任务数少于64个,用户可以通过修改OS_CFG.h文件的OS_LOWEST_PRIO来确定最低优先级(优先级为:0~OS_LOWEST_PRIO)。OS_LOWEST_PRIO赋给空闲任务,如果用户使用了统计任务,系统还会把(OS_LOWEST_PRIO-1)赋给统计任务,用户可以使用的优先级范围为:0~OS_LOWEST_PRIO-2,在创建任务时,用户必须指定任务的优先级(指定OSTaskCreate( )第四个参数)。

任务堆栈:任务的运行环境,在程序设计上体现为一数组,出栈入栈遵循LIFO后进先出的原则。任务堆栈的定义:宏定义设置堆栈存储单位(可理解为数据类型)type、宏定义设置堆栈大小size、用type定义大小为size的数组用作任务堆栈。

任务的定义:使用系统函数OSTaskCreate(指向任务代码的指针,传递给任务的参数,任务堆栈的栈顶指针,任务优先级),需要提醒的是,处理器不同,栈的生长方向不同,stm32f103的栈生长方向是从高地址到低地址,所以栈顶指针是堆栈数组的最后一个成员的地址。

int 16位;unsigned int 位数与操作系统相关。

任务堆栈的初始化:由于任务的运行前,CPU的各个寄存器需要预置一些原始数据,包括指向任务的指针、程序状态字PSW等,因为它们因任务不同而有差异,所以存储在任务堆栈中,创建任务时将这些值放入堆栈中称为堆栈的初始化。堆栈的初始化由OSTaskCreat( )函数调用OSTaskStkInit( )实现,用户除了在移植操作系统时修改它,基本不会接触到这个函数。

附上一篇的脑图链接及密码:http://naotu.baidu.com/file/8910fc6778b390b730a755e610790477?token=86bdf5ad5bee75c3 密码: SC2h

嵌入式实时操作系统ucosii原理及应用(任哲)-- --阅读笔记2相关推荐

  1. 嵌入式实时操作系统ucosii原理及应用(任哲)

    本文是<嵌入式实时操作系统ucosii原理及应用(任哲)>一书第三章的阅读笔记,知识点多为摘录,若希望深入了解,请购买该书认真研读.由于一些知识比较零散,记起来不大方便,又习惯画图辅助记忆 ...

  2. makefile的基本使用方法,使用bc编译文件的例子-参照任哲的《嵌入式实时操作系统μCOS-II原理及应用-任哲(第3版)》

    实验例子文件:(不一定需要,本文有所有内容,在此给出只是为了方便) makefile的基本使用方法,使用bc编译文件的例子-参照任哲的<嵌入式实时操作系统μCOS-II原理及应用-任哲(第3版) ...

  3. 嵌入式实时操作系统ucosii原理及应用(任哲)-- --阅读笔记1

    嵌入式计算机系统与通用型计算机相比,具有以下特点:专用性强.可裁剪性好.实时性与可靠性好.功耗低. 嵌入式计算机系统一开始是建立在与通用型计算机系统相似的硬件环境中的,由于通用性计算机系统的可裁剪性. ...

  4. 参考任哲的《嵌入式实时操作系统μC_OS-II原理及应用》,对UCOS的任务调度做了下整理。

    参考任哲的< 嵌入式 实时操作系统μC_OS-II原理及应用>,对 UCOS 的任务调度做了下整理. UCOS有两种调度器,一种是任务级的调度器,一种是中断级的调度器.任务级的调度器由OS ...

  5. 嵌入式实时操作系统UCOSII(邵贝贝)--笔记之实时系统概念(第二章)

    2.实时系统概念 实时系统的特点是,如果逻辑和时序出现偏差将会引起严重后果的系统.有两种类型的 实时系统:软实时系统和硬实时系统.在软实时系统中系统的宗旨是使各个任务运行得越快 越好,并不要求限定某一 ...

  6. 嵌入式实时操作系统ucos-ii_「正点原子NANO STM32开发板资料连载」第三十六章 UCOSII 实验 1任务调度...

    1)实验平台:alientek NANO STM32F411 V1开发板2)摘自<正点原子STM32F4 开发指南(HAL 库版>关注官方微信号公众号,获取更多资料:正点原子 第三十六章 ...

  7. 嵌入式实时操作系统ucos-ii_「正点原子NANO STM32开发板资料连载」第三十八章 UCOSII 实验 3...

    1)实验平台:alientek NANO STM32F411 V1开发板2)摘自<正点原子STM32F4 开发指南(HAL 库版>关注官方微信号公众号,获取更多资料:正点原子 第三十八章 ...

  8. 《嵌入式实时操作系统 uc/OS-II 原理及应用》【任哲 主编】随书例程以及使用方法

    说明 uc/OS-II 是一款开源的实时操作系统,但是如果用于商业,是需要付费的.为了深入了解,找到任哲老师的<嵌入式实时操作系统 uc/OS-II 原理及应用>一书,总体还不错.但是书中 ...

  9. 嵌入式实时操作系统11——操作系统内核运行原理

    先展示一个操作系统运行动态图 1.操作系统内核关键知识点 本文将用一个实际的工程例子来剖析操作系统内核运行原理.在此之前我们先回顾一下之前文章讲述的重点知识点. <嵌入式实时操作系统3--任务切 ...

最新文章

  1. Kong Api 网关使用 docker 部署
  2. 三大深度学习生成模型:VAE、GAN及其变种
  3. 常用数学符号读法大全
  4. Redis源码剖析(六)事务模块
  5. 安卓进阶系列-02搜索框(PersistentSearch)的使用
  6. doublevalue_Java Integer类doubleValue()方法与示例
  7. 转:VC中MessageBox的常见用法
  8. matlab实现整数规划/01规划
  9. python在scatter中添加图例_如何向matplotlib散点图添加图例
  10. 测试计划与测试方案的区别
  11. USB及手机平板设备插拔响应解决方案
  12. vue+element tree(树形控件)组件(1)
  13. Spring Security简介和认识
  14. 295.数据流的中位数
  15. springboot毕业设计管理系统(带论文)
  16. 计算机c语言实验心得与小结,C语言实验心得体会
  17. win7桌面图标箭头怎么去掉
  18. Word从指定页开始插入页码
  19. 微信里的网址链接域名如何自动跳转到外部浏览器访问源码
  20. TWINSNOW - Snowflakes 哈希

热门文章

  1. 黑马程序员----面试题之交通管理系统
  2. 利用ffmpeg录制rtsp流的方法总结(一)
  3. python爬虫实例练习:爬取慕课网课程名称以及对应的链接
  4. ORACLE 11G中的ADR介绍:
  5. Rhino6 平面洞倒角不成功
  6. 奇妙的傅里叶变换,原来是这样子滴!
  7. 以评审制度促进团队研发效率提升
  8. 想找几个人组团队长期有业务包生活底薪
  9. 暗黑破坏神3怎么修改服务器,暗黑破坏神3设定档更新中解决办法
  10. 家庭“非处方药”完全手册