uC/OS内核从0到1
我是来写博客的
这个作者很懒,什么都没留下…
展开
-
【22】从0到1教你写uC/OS-III————>写在最后
此教程只实现一个基本的任务调度功能 没有加入信号量邮箱等同步通信机制 但己体现了系统的精髓 如果想继续深入学习;推荐看:自己动手从0到1写嵌入式操作系统-李述铜-专题视频课程https://blog.csdn.net/oLiShuTong/article/details/83575921 参考资料: 野火《uC/OS-III内核实现与应用开发指南-基于SMT32》 ...原创 2020-04-17 23:50:28 · 214 阅读 · 0 评论 -
【21】从0到1教你写uC/OS-III————>任务删除
简述: 一个任务被删除后就进入休眠态,要想继续运行必须重新创建 被删除任务的TCB从任务控制块链表中删除,并归还给空任务控制块链表 在就绪列表中把该任务的就绪状态置为0,该任务就不能被调度器所调用 例程 任务删除OSTaskDel(); /********************************************************* * 函数名: ...原创 2020-04-17 23:41:15 · 253 阅读 · 0 评论 -
【20】从0到1教你写uC/OS-III————>任务的挂起和恢复
简述 uc/OS的任务支持挂起和恢复功能 挂起相当于暂停,暂停后从就绪列表中移除 恢复即重新将任务插入到就绪列表 一个任务挂起多少次就要被恢复多少次才能重新运行 例程代码 自定义任务的状态 修改任务控制块TCB 挂起函数OSTaskSuspend() 恢复函数OSTaskResume() 总结...原创 2020-04-17 23:05:12 · 270 阅读 · 0 评论 -
【19】从0到1教你写uC/OS-III————>时间片
bbb原创 2020-04-16 23:15:20 · 230 阅读 · 0 评论 -
【18】从0到1教你写uC/OS-III————>时基列表
简述: 所有的实时系统都需要一个能提供周期性时间的时间源,叫做时基周期或系统周期; 当时基任务执行时,它会遍历队列中所有等待期满的任务、等待事件超时的任务; 时基任务会就绪时基列表中的那些期满、超时的任务; 时基列表中包含了一个表OSCfg_TickWheel[]和一个计数器OSTickCtr; 这个表由OS_CFG_TICK_WHELL_SIZE记录,记录数取决于处理器的RAM...原创 2020-04-15 23:31:10 · 363 阅读 · 1 评论 -
【17】从0到1教你写uC/OS-III————>支持多优先级
简述: 本章之前OS还没有用到优先级,只支持两个任务相互切换; 本章之后加入优先级功能,在uC/OS-III中,数字优先级越小,逻辑优先级越高; 修改之前如下几个函数: OSInit(); 任务控制块TCB; 任务创建OSTaskCreate(); 空闲函数OS_Idle_TaskInit(); 系统启动函数OSStart(); 任务切换PendSV_H...原创 2020-04-13 23:50:58 · 249 阅读 · 0 评论 -
【16】从0到1教你写uC/OS-III————>就绪列表
简述: 在uC/OS中,任务被创建后,任务的TCB会被放入就绪列表中,表示任务己就绪,随时可能被运行; 就绪列表包含2部分: 任务优先级的优先级表; 存储任务TCB的双向链表; 优先级表: 优先级表就是一个类型为INT32U的数组OSPrioTbl[]; 它的每一个二进制位对应一个任务; 该位的值为1表示对应的任务处于就绪状态,为0表示对应的任务处于非就绪状态...原创 2020-04-10 23:17:10 · 261 阅读 · 0 评论 -
【15】从0到1教你写uC/OS-III————>临界段
简述: 临界段也叫临界域,是一段不可分割的代码; 如何临界段可以被中断,那么就需要关中断以保护临界段; 如果临界段可能被任务级代码打断,那么需要锁调度器保护临界段; 什么时候用临界段? 你认为这段代码不希望被中断的时候; 临界段的本质就是开(进入临界段)、关(退出临界段)系统中断; 实现方式 简单直接:CPSID / CPSIE (在临界段嵌套中就会出现问题) 程...原创 2020-04-05 23:40:09 · 179 阅读 · 0 评论 -
【14】从0到1教你写uC/OS-III————>时间戳(测试任务执行效率)
简述: 时间戳主要用来测试任务时行时长,以此来判断该段代码的执行效率;如果时间过长就可以优化调整代码; 本质上就是一个任务起始——>终止的时间点; 测试方式: 比如测量任务A的执行效率,在A任务运行前记录一个时间点TimeStart,运行完记录一个时间点TimeEnd;那么这段代码的运行时长TimeUse = TimeEnd - TimeStart;这两个时间点就叫做时间戳 ...原创 2020-04-05 22:33:21 · 299 阅读 · 0 评论 -
【13】从0到1教你写uC/OS-III————>阻塞延时与空闲任务
上章节系统所有延时,与前后台无差别,体现不出RTOS的优势; RTOS的优势就是榨干系统性能,永远不让CPU闲着; 因此任务需要延时就不能让CPU空等,至此加入阻塞延时概念; 阻塞延时:即任务需要延时的时候,任务放弃CPU的使用 权,CPU可以去干其它事,当任务延时时间到,重新获取CPU使用权,任务继续运行,充分利用CPU的资源,而不是干等; 空闲任务:系统初始化时创建的优先级最低的任务,...原创 2020-04-02 00:03:34 · 278 阅读 · 0 评论 -
【12】从0到1教你写uC/OS-III————>时间片
RTOS需要一个时基来驱动,系统任务调度的频率等于该时基的频率;通常该时基由一个定时器来提供,也可以从其它周期性的信号源获得 Crotex-M内核中有一个系统定时器SysTick,它内嵌在NVIC中,是一个24位的递减计算器,每计数一次时间为:1/SysClk; 当重载数值寄存器的值递减到0的时候,系统定时器就产生一次中断,如此循环往复; SysTick寄存器介绍: 初始化与裸机例程相同...原创 2020-03-31 23:52:02 · 211 阅读 · 0 评论 -
【11】从0到1教你写uC/OS-III————>综合例程,任务创建测试
功能描述: 两个任务不停运行,flag1,flag2交替翻转,任务结束,切换另一任务; 主函数例程代码: #include "os.h"#include "ARMCM3.h"/******************************************************************************************************...原创 2020-03-30 23:16:55 · 266 阅读 · 0 评论 -
【10】从0到1教你写uC/OS-III————>任务切换OSSched
任务切换是在中断函数运行完后调用 前后台系统是从中断处返回继续运行,多任务不同,需要通过一次任务调度来决定返回的去向(可能是一个优先级更高的任务) 本例程略简单,如果是任务1下个就是任务2;如果是任务2下个就是任务1; 例程: /********************************************************* * 函数名: void OSS...原创 2020-03-30 23:01:04 · 371 阅读 · 0 评论 -
【9】从0到1教你写uC/OS-III————>任务切换PendSV异常
OSStartHighRdy()用于启动任务切换,即配置PendSV异常为最低优先级,然后触发PendSV异常 PendSV函数内进行任务切换,无返回值,使用汇编程序编写 常见ARM汇编指令详解: EQU:给数字常量取一个符号名,相当于C语言中的define AREA:汇编一个新的代码段 或者 数据段 SPACE:分配内存空间 PRESERVE8:当前文件堆栈按照8字节对齐 ...原创 2020-03-29 23:56:58 · 417 阅读 · 0 评论 -
【8】从0到1教你写uC/OS-III————>系统启动
系统启动的前提:至少创建一个任务 应用程序是通过调用OSStrart()开始进入多任务管理的 例程: /********************************************************* * 函数名: void OSStrart(OS_ERR *p_err) * 描述 :系列启动 * 输入 :无 * 输出 :无 * 返...原创 2020-03-29 22:19:57 · 143 阅读 · 0 评论 -
【7】从0到1教你写uC/OS-III————>任务就绪表初始化
系统总是从处于就绪状态中的任务来选择一个任务运行 任务就绪表:登记了系统中所有处于就绪状态的任务(位图表) 就绪表是个链表 链表有:增、删、改、查; 就绪表有:登记、注销、查找 例程: /********************************************************* * 函数名:void OS_RdyListInit(void); * ...原创 2020-03-29 21:46:38 · 176 阅读 · 0 评论 -
【6】从0到1教你写uC/OS-III————>系统初始化
初始化:对uC/OS自身的运行环境初始化 全局变量、数据 结构 创建空闲任务,并赋予最低优先级、永远的就绪态 例程: /********************************************************* * 函数名:void OSInit(OS_ERR *p_err); * 描述 :初始化全局变量,就绪列表 * 输入 :无 * 输...原创 2020-03-27 23:59:15 · 335 阅读 · 0 评论 -
【5】从0到1教你写uC/OS-III————>任务就绪表
将任务添加到就绪表里面,表示任务己就绪,随时可以调度 为系统中处于就绪状态的任务分配CPU是多任务系统的核心工作 系统总是从处于就绪状态的任务中来选择一个运行 如果系统中无任何应用任务需要运行,就运行空闲任务 例程: /********************************************************* * 函数名:void OS_RdyListInit...原创 2020-03-27 23:32:07 · 211 阅读 · 0 评论 -
【4】从0到1教你写uC/OS-III————>堆栈初始化
CPU在启动运行一个任务时,CPU的各寄存器总是需要预置一些初始数据,例如指向任务的指针、程序状态字PSW等 由于它们都是任务的私有数据,所以应该将它们都存放在任务堆栈 当任务获取CPU的使用权时,就把堆栈的内容复制到CPU的各寄存器中,从而使任务顺利运行 例程: /********************************************************* * ...原创 2020-03-27 22:41:09 · 342 阅读 · 0 评论 -
【4】从0到1教你写uC/OS-III————>任务定义与创建
RTOS中任务的表现形式: 功能独立 无限循环 全程: void Task(void *parg){ for(;;) { //add user code }} 创建任务的关键参数: 定义任务堆栈 任务控制块OS_TCB 创建任务 定义任务堆栈: 多任务系统中,每个任务相互独立,互不干扰; 因此要...原创 2020-03-27 22:30:14 · 280 阅读 · 0 评论 -
【3】从0到1教你写uC/OS-III————>新建工程
新建工程 新建文件 添加文件: 编写main函数 : int main(void){ for(;;) { //无事可干 } } 调试配置 软件仿真 设置时钟大小 添加头文件路径 省略; C/C++标签下; 编译: 总结:本教程章节,大多数都是用keil软件仿真,不需要用到开发板;...原创 2020-03-23 22:28:00 · 155 阅读 · 0 评论 -
【2】从0到1教你写uC/OS-III————>栈
栈: 一种以指针形式表现的数据结构,只跟RAM有关,本质上是地址自增、自减,只是用来调换枪头(任务切换),才会用到它; 作用: 保护现场 传递参数 临时变量保存在栈中 栈底:栈存储变量的起始地址 栈顶:栈中最后压入数据的地址 栈大小:与RAM有关 栈顶指针:SP(Stack Poin),堆栈保存数据通过SP实现,PUSH或者POP时SP自动递增或者递减 CPU寄存器...原创 2020-03-20 22:50:38 · 198 阅读 · 0 评论 -
【1】从0到1教你写uC/OS-III————>裸机系统与多任务系统
系统分类: 裸机系统: 轮询系统:按顺序执行,不会出现特殊事件打扰,比如突然响应个外部输入信号; 前后台系统:本质上也是轮询系统,只是在其基础上加入中断,外部事件的响应在中断完成;中断称为:前台;循环:称为后台 ; 多任务系统: 多任务系统的响应也是中断中完成的,事件的处理是在相应的任务中完成,也具有优先级; 依据程序的功能,将程序主体分割成一个个独立的,无限循环,...原创 2020-03-19 23:57:52 · 183 阅读 · 0 评论 -
【0】从0到1教你写uC/OS-III————>开篇:为什么要重复造轮子
为什么要重复造轮子 市面上的教程都是怎么调用库函数,很少对其实现原理进行分析;本教程从最简单系统讲起,不断迭代,教你怎么从0开始把uC/OS-iii写出来; 能深入了解uC/OS的运行机制,当在调试程序时能快速定位错误点,而不是一头莫展; 如何学习RTOS? 目前市面所有的RTOS内核实现方式、运行机制大同小异;深入学习其中一款,再换其它的RTOS都是得心应手 就如同熟悉一个人,...原创 2020-03-19 23:35:00 · 343 阅读 · 0 评论