uCOS/ii 学习心得及体会

简介: 1、首先发布 任哲的《嵌入式实时操作系统uCOS-II原理及应用》        这本书非常适合初学者学习 uCOS-ii       2、   请问:空闲任务和统计任务是否建立任务...
1、首先发布 任哲的《嵌入式实时操作系统uCOS-II原理及应用》 
      这本书非常适合初学者学习 uCOS-ii

   

 
2、   请问:空闲任务和统计任务是否建立任务控制块呢?
            任务块链表中是否存在空闲任务和统计任务的任务控制块呢?如果没有的话,操作系统如何调度呢?
        标准答案:
            在uCOS/ii内核中,调用OSInit()函数中会首先创建空闲任务,同时当用户“允许”统计任务时,也会接着创建统计任务。
            因此任务块链表中存在空闲任务和统计任务的任务控制块。


3、   请问:为什么有了正在使用任务控制块链表OSTCBList和空闲任务控制块链表OSTCBFreeList,还要再定义OSTCBPrioTbl[]呢?
       标准答案:
             数组OSTCBPrioTbl[]是以任务号为索引,里面保存的任务0到最大任务的任务控制块(TCB)的首地址,据此可以通过任务优先级号(任务号)快速找到当前任务在任务控制块中的首指针,而不必到任务控制块链表中一步一步的查找,加快访问时间。加快任务切换时间。
    

4、   uCOS/II中,能够引起任务调度的系统函数有哪些?

         (1)、OSStart() uCOS/II启动
         (2)、OSTaskSuspend()挂起任务
         (3)、OSTaskResume()恢复任务
          OSTimeDly()/OSTimeDlyHMSM()、等待一个事件的发生(包括OSSemPend(), OSMutexPend, OSFlagPend, OSMboxPend(), OSQPend(),

5、   请问:既然有了任务就绪表INT8U OSRdyTbl[64],为什么还要再定义
           INT8U  OSRdyGrp[8]呢?这样做的好处是什么?
       标准答案:
          OSRdyTbl[64]是任务就绪表,当表中 元素的值=1时,表示 任务处于就绪状态。 例如: OSRdyTbl[0]= 1,则表示:任务级别号=0的任务处于就绪状态,可以被调度器立即置于“运行态”。
        为了节省查找时间(如果让操作系统每次查找处于就绪状态的最高优先级别的任务时,都从下标0开始查找,有点太浪费时间了),因此又专门定义了一个数组OSRdyGrp[8]。

     其中:
         (1)、OSRdyGrp[0]对应OSRdyTb[0]~OSRdyTbl[7]
         (2)、OSRdyGrp[1]对应OSRdyTb[8]~OSRdyTbl[15]
         (3)、OSRdyGrp[2]对应OSRdyTb[16]~OSRdyTbl[23]
       这样,每次查找就绪表中最高优先级别的任务,就可以这样查找,首先查找依次从OSRdyGrp[0]~OSRdyGrp[7]开始查找不等于0的项,假如OSRdyGrp[1] >=1,则表示任务号8到任务号15有级别最高的就绪任务。
      最终查找范围从0-64缩小到8-15。最终节省了查找时间。

  6、 请问:任务调度的核心是什么?
      标准答案:
              在多任务操作系统中,命令CPU中止当前正在运行的任务转而去运行另外一个任务的工作叫做任务切换。
       任务调度主要完成两个工作:
      (1)、在任务就绪表中查找具有最高优先级别的就绪任务。
      (2)、实现任务切换
        说的更明白一些,就是将找到的的最高优先级别的任务的“任务号”---> “当前任务的任务号OSPrioCur”;从OSTCBPrioTbl[]取出最高优先级别任务的任务控制块首地址---> “当前任务的任务控制块指针OSTCBCur”
       最后调用OS_TASK_SW()完成现场切换(即将CPU的寄存器信息保存到当前正运行任务的私栈中,然后从待运行的高优先级别的任务私栈中弹出原先保存寄存器信息到CPU)。

//-----------------------------------
     OSPrioCur 是全局变量,用于保存当前正在运行任务的任务号
     OSTCBCur是全局变量,用于指向当前正在运行任务的任务控制块首地址。


7、任务切换的关键:其实是堆栈的切换。
        切换时:
            (1)、第一步:将当前CPU的SP寄存器的值保存到“待中止任务”的任务控制块中。即保存到结构体OS_TCB的OSTCBStkPtr成员中。  
            (2)、第二步:从“待运行任务”的任务控制块的OSTCBStkPtr成员中取出待运行任务的堆栈指针,然后送给CPU的SP寄存器。

8、(OSTCB *)1 是什么意思


(原文件名:OSTCB_1是什么意思.JPG)
引用图片




9、 启动任务函数OSStart()之前必须遵守的约定:

        uCOS/II运行之前,必须调用系统函数OSStart()。▲▲▲此时切记:
        调用系统函数OSStart()之前,“必须”已经创建了一个任务,并赋予它最高优先级别,从而使它成为起始任务;然后在这个起始任务中,再创建其它“低优先级别”的任务。


10、 什么时候开启全局中断?

        (1)、由于启动任务函数OSStart()之前必须遵守的约定:
        在调用系统函数OSStart()之前,先创建一个任务,并赋予它最高优先级别,从而使它成为起始任务;然后在这个起始任务中,再创建其它任务。
        (2)、因此执行系统函数OSStart()后,uCOS/II会自动调度用户创建的最高优先级别的任务,所有在这个“最高优先级别的任务”中开启全局中断最合适。
         例如:下面的例子为:在系统函数OSStart()之前,创建了一个“最高优先级别的任务”TaskStart()--->
         OSTaskCreate(TaskStart,......)
         因此在TaskStart()任务首次被调度时,开启全局中断。

        注意:千万不要在系统函数OSStart()之前开启全局中断,否则操作系统会崩溃。因为此时uCOS/II内部环境还没有完全初始化完成。


(原文件名:什么时候开启全局中断.JPG)
引用图片




(原文件名:OS_EXIT_CRITICAL()就是开启全局中断.JPG)
引用图片




11、 执行系统函数OSStart()的时候,为什么还要增加如下的条件:

          if (OSRunning == FALSE)
          {
                          ,,,,,,,,,,,,,,,,
          }
   
          此时应该没有任务被调度呀(即:OSRunning 应该等于 FALSE)!
          只有当执行了系统函数OSStartHighRdy()的时候,即调度最高优先级别任务的时候,才置   OSRunning = TRUE。   
       难道我的理解错了吗?
       为什么呀!


(原文件名:执行OSStart()的时候,为什么需要判断 if (OSRunning == FALSE) 呢?.JPG)
引用图片





12、uCOS/II中所说的中断服务程序调度,是否仅仅是指时钟节拍中断服务程序呢?
        例如:是否仅仅时钟节拍中断服务程序中才能调用OSIntExit(),串口中断服务中不允许调用OSIntExit()进行任务调度呢?

       一般用户程序,例如:串口中断服务程序是否
                (1)、不能调用系统函数 : OSIntExit()进行任务调度
                (2)、可以调用系统函数 : OSIntExit()进行任务调度,也可以不调用系统函数 : OSIntExit()进行任务调度。

 

 

http://www.ourdev.cn/bbs/bbs_content.jsp?bbs_sn=4426625

目录
相关文章
|
11月前
|
人工智能
新手必看,写歌词的技巧和方法新分享,妙笔生词AI智能写歌词软件
对于新手,写歌词不再难。本文分享了写歌词的实用技巧,如积累生活素材、明确主题、合理安排主副歌、简洁有力的语言表达等。推荐使用“妙笔生词智能写歌词软件”,其AI功能可助你灵感不断,轻松创作。
|
9月前
|
人工智能 自动驾驶 安全
“第四次工业革命”-AI革命
“AI变革”被誉为“第四次工业革命”。中国在AI领域持续发力,占亚太地区AI支出的五成,预计2023年市场规模将达到147.5亿美元,约占全球市场的十分之一。IDC预测,中国生成式AI市场年复合增长率将达86.2%。国内企业如百度、阿里、清华等在AI技术研发和应用方面取得显著进展,推动了无人驾驶、送餐机器人、无人快递车等应用场景的发展。尽管AI带来了降本增效,但也引发了就业和社会压力。总体而言,中国在AI领域的投入和发展势头强劲,未来前景广阔。
706 0
“第四次工业革命”-AI革命
|
11月前
|
传感器 人工智能 机器人
水下无人机:深海探索的未来工具
【10月更文挑战第6天】水下无人机作为深海探索的未来工具,正不断突破技术瓶颈,拓宽人类对深海的认知边界。它们在深海科学研究、资源勘探、军事应用以及环境保护中展现出了巨大的潜力和价值。随着技术的不断进步和应用的不断拓展,水下无人机将迎来更加广阔的发展空间,为人类探索和保护海洋提供强有力的技术支持。
|
12月前
|
安全 数据安全/隐私保护
WiFi工作原理及WiFi接入过程
【9月更文挑战第17天】WiFi(Wireless Fidelity)是一种基于IEEE 802.11标准的无线局域网技术,使用2.4GHz和5GHz频段进行数据传输,并通过正交频分复用(OFDM)技术提高传输效率。WiFi网络通常由接入点和客户端组成,采用IEEE 802.11系列协议实现通信。接入WiFi网络需经历扫描、选择网络、身份验证和关联等步骤,最终实现数据传输。
1162 4
|
11月前
|
机器学习/深度学习 监控 自动驾驶
深度学习在图像处理领域的应用与前景展望
【10月更文挑战第18天】深度学习在图像处理领域的应用与前景展望
355 0
|
11月前
|
数据采集 存储 监控
组建数据治理团队:从无到有的实践指南
通过以上四个步骤,可以从无到有地建立和完善一个高效的数据治理团队。这个团队将帮助企业更好地管理和利用自己的数据资产,从而为企业创造更大的价值。
|
人工智能 JSON 文字识别
开源VLM新标杆 InternVL 2.0 怎么用?部署、微调尽在魔搭社区!
7月4日下午,世界人工智能大会科学前沿论坛,上海人工智能实验室OpenGVLab发布了InternVL 2.0 版本,中文名书生·万象。
|
安全 关系型数据库 MySQL
揭秘:如何在无影的Serverless世界中,悄无声息地操控MySQL数据库!
【8月更文挑战第8天】在云计算领域,Serverless 枟能凭借其高效与弹性特性脱颖而出。本文采用问答形式解析函数计算环境中 MySQL 数据库的安全高效访问方法。介绍了如何利用数据库插件或 SDK 连接 MySQL,并提供了一个使用 Python 和 `pymysql` 在阿里云函数计算中连接 MySQL 的示例代码片段。同时强调了通过环境变量或密钥管理服务安全处理数据库凭证的重要性。随着 Serverless 技术的发展,数据库操作将更加简便。
189 7
|
Java Maven
如何解决IDEA的已忽略的pom.xml
如何解决IDEA的已忽略的pom.xml
678 0
|
前端开发 开发者
【第17期】一文读懂原子 CSS
【第17期】一文读懂原子 CSS
361 0