根据正点原子ucosIII移植视频的一些理解。。。。。。
1.任务管理(上)
(1)Cortex-M3权威指南(中文)-NVIC与中断控制-SysTick定时器->倒数为0,重装->delay_init()修改时间
(2)任务堆栈、任务控制块和任务函数
任务堆栈:用来保护任务的工作环境
任务控制块:用来记录任务的各个属性
任务函数:任务处理代码
(3)5个系统任务
空闲任务:必创建的第一个任务 OS_IdleTaskInit();
时钟节拍任务:必创建 OS_TickTaskInit();
统计任务:统计CPU使用率和各个任务的堆栈使用量;OS_StatTask()
定时任务:提供定时服务 OS_TmrTask()
中断服务管理任务:会把缓存队列中存放的信息重发给相应的任务;优先级永远为0
(4)任务状态(有转换关系图)
休眠态:已经在flash,不受ucos管理
就绪态:具有运行的条件了
运行态: 正在运行
等待态:需要等待
中断服务态:发生中断,cpu执行中断服务函数
2.任务管理(中)
(1)创建任务堆栈:先进先出(FIFO)原则;每个任务都要有堆栈
初始化函数:OSTaskStkInit(); 一般由OSTaskCreate()调用
(2)任务控制块:OS_TCB 是结构体;初始化函数OS_TaskInitTCB(p_tcb);
(3)任务就绪表:
优先级:级数由OS_CFG_PRIO_MAX宏定义决定;数值越小,优先级越高;
就绪表:优先级位映射表和就绪任务表;OS_PrioGetHighest()找到最优先级
3.任务管理(下)
(1)任务调度:任务级调度器OSSched()和中断级调度器OSIntExit();
(2) 任务调度点:(比较常用的)
使用延时函数OSTimeDly()或OSTimeDlyHMSM();
创建任务;
删除任务;
调用OSTaskSuspend()将自身挂起;
用户调用OSSched();
(3)时间片轮转调度:OS_SchedRoundRoBin();
ucosIII允许一个优先级下有多个任务,每个任务可以执行指定的时间,然后轮到下一个任务
(4)任务切换:任务级切换和中断级切换
(5)最先初始化话OSInit();OSStart() 系统启动;
4.任务创建和删除 OSTaskCreate() 创建函数;OSTaskDel()删除函数。
5.任务挂起和恢复 OSTaskSuspend()挂起函数;OSTaskResume()恢复函数。
6.时间片轮转调度
(1) OS_CFG_SCHED_ROUND_ROBIN_EN置1 ,先调用OSSchedRoundRobinCfg(DEF_ENABLED,1,&err)函数;
时间片长度为1个系统时钟节拍,既1*5=5ms
(2)(OS_TICK )2, //2个时间片,既2*5=10ms 如果时间片不够用,可以多设置
7.系统内部任务
钩子函数:os_app_hooks.c文件 修改 App_OS_TimeTickHook()函数
8.中断和时间管理
(1)中断处理
void USART1_IRQHandler()
{
OSIntEnter();
//中断服务程序
OSIntExit();
}//最多支持250级嵌套
(2)临界段代码保护 :保证其完成,不能被打断
OS_CRITICAL_ENTER(); //进入临界区
OS_CRITICAL_EXIT(); //退出临界区
(3)时间管理-任务延时:
除了空闲任务的所有任务必须在合适的位置调用系统提供的延时函数,
让当前任务暂停运行一段时间并进行一个任务切换。
延时函数:OSTimeDlyHMSM()和OSTimeDly()
9.软件定时器
(1)本质是递减计数器,递减到0,调用回调函数。OS_CFG_TMR_EN置1
(2)OSTmrCreate();OSTmrStart();OSTmrStop();
(3)单次定时器:开始倒计数,直到为0调用回调并停止。只执行一次。
周期模式:循环执行
10.信号量和互斥信号量
(1)信号量用于控制对共享资源的保护,但是基本用来做任务同步用。
(2)二进制信号量:I/O设备
计数型信号量:用于某些资源可以同时被几个任务使用
(3)os_sem.c文件
OSSemCreate();建立一个信号量
OSSemPend();等待一个信号量
OSSemPost();释放或者发出一个信号量
(4)如果没有建立信号量,两个任务同时直接访问共享资源(如数组),程序不会输出两个任务结果;
如果建立信号量后,两个任务分别请求信号量,就可以输出两个任务结果。
(5)信号量用于任务同步
举例:A任务按键按下,B任务因为A任务按键按下就亮灯
(6)使用互斥信号量解决优先级反转问题 os_mutex.c文件
OSMutexCreate();建立一个互斥信号量
OSMutexPend();等待一个互斥信号量
OSMutexPost();释放或者发出一个互斥信号量
(7)任务内嵌信号量:简化代码,比独立的信号量更有效 ;os_task.c文件;不用先建立信号量
OSTaskSemPend();等待一个任务量
OSTaskSemPost();发布一个任务量
11.消息传递
(1)任务间通信
任务与任务之间交流信息,信息传过程叫做任务间通信;
传递途径分为全局变量和发布信息;
(2)消息包含以下部分:指向数据的指针、数据长度和记录消息发布时刻的时间;
指针传递,不是值传递 ;
(3)os_q.c文件 : OS_MSG_Q MsgQ
OSQCreate();创建一个消息队列
OSQPend();等待消息队列
OSQPost();发布消息队列
(4)任务内建消息队列
OSTaskQPend();等待消息
OSTaskQFlush();清空任务的消息队列
12.事件标志组
(1)有时候 一个任务需要跟多个事件同步,需要使用事件标志组:或同步、与同步
OS_FLAG_GRP EventFlags; //定义一个事件标志组
OSFlagCreate();//创建事件标志组
OSFlagPost(); //发送事件标志组
OSFlagPend();// 等待事件标志组
13.同时等待多个内核对象:OSPendMulti();
UCOSSIII 只支持同时等待多个信号量和消息队列,不支持同时等待多个事件标志组和互斥信号量
14.信息队列、信号量、事件标志组的区别
(1)任务通信可以通过全局变量和信息队列,简单来说就是任务之间可以传递数据等等。。。
(2)任务同步可以通过信号量和事件标志组,简单来说就是等待某个事件的发生,直到满足条件。。如果没有请求到就会一直阻塞函数
15.存储管理
OS_MEM INTERNAL_MEM; //定义一个存储区
OSMemCreate();//创建一个存储分区
一个地址代表一个字节,32位机器表示用32个二进制位表示地址,那么寻址空间就是2^32。
程序定义存储块大小是100字节,地址也是差100


注意事项
1.HardFault_Handler故障
使用UCOSII写任务时,任务里面要有while(1)循环;
如果没有while(1)循环,会导致ucosII运行出现硬件故障。
任务之间切换是在while里面,只有开机才运行初始化。
2.DMA使用
如果使用DMA,要初始化相对应的外设。比如使用了DMA1_Channel4通道,根据下图要初始化SPI2_RX。

本文详细介绍了UCOSIII在Cortex-M3平台上的移植和应用,涵盖任务管理的各个方面,包括任务创建、任务堆栈、任务控制块、系统任务、任务状态转换、任务调度、时间管理、中断处理、软件定时器、信号量、互斥信号量、消息传递、事件标志组等。此外,还涉及存储管理和任务间的通信与同步机制,为理解和实践UCOSIII操作系统提供了深入的指导。
1万+

被折叠的 条评论
为什么被折叠?



