UCOS-III文件系统的操作
ucosiii操作系统工作原理
ucosiii操作系统工作原理ucosiii是一种常用的嵌入式实时操作系统,它具有高度可靠性和高实时性的特点。
本文将介绍ucosiii操作系统的工作原理。
ucosiii操作系统是由美国Micrium公司开发的一种实时操作系统,它是用C语言编写的,可以运行在各种嵌入式系统中。
ucosiii采用了一种基于内核对象的任务管理机制,可以有效地管理系统中的各个任务,并提供了丰富的服务功能,如任务间通信、时间管理、内存管理等。
在ucosiii中,任务是操作系统的基本执行单元,每个任务都有自己的优先级和堆栈空间。
ucosiii使用了一种优先级抢占式的调度算法,即优先级高的任务可以抢占优先级低的任务的执行权。
这种调度算法可以保证高优先级任务的及时响应,并提高系统的实时性。
ucosiii的任务管理机制是通过任务控制块(TCB)来实现的。
每个任务都有一个对应的TCB,其中包含了任务的状态、优先级、堆栈指针等信息。
ucosiii通过不同的系统调用函数来管理任务的创建、删除、挂起、恢复等操作。
任务的切换是通过ucosiii的任务调度器来完成的,任务调度器会按照任务的优先级进行任务切换。
ucosiii提供了丰富的服务功能,其中包括任务间通信、时间管理、内存管理等。
任务间通信是通过信号量、邮箱、消息队列等机制来实现的,可以实现任务之间的数据共享和同步。
时间管理功能可以实现任务的定时执行和延时操作,可以满足实时系统对时间要求的需要。
内存管理功能可以对系统的内存进行分配和释放,提高系统的资源利用率。
ucosiii的内核对象是操作系统提供的一种资源管理机制,包括信号量、邮箱、消息队列等。
这些内核对象可以用于任务间的同步和通信,可以有效地避免资源竞争和数据冲突的问题。
ucosiii的工作原理可以总结为以下几个步骤:1. 初始化ucosiii操作系统,包括初始化任务控制块、任务堆栈等。
2. 创建任务,包括创建任务控制块、任务堆栈等。
UCOSIII(一)
UCOSIII(⼀)⼀,前后台系统和RTOS1,前后台系统早期嵌⼊式开发没有嵌⼊式操作系统的概念,直接操作裸机,在裸机上写程序,⽐如⽤51单⽚机基本就没有操作系统的概念。
通常把程序分为两部分:前台系统和后台系统。
简单的⼩系统通常是前后台系统,这样的程序包括⼀个死循环和若⼲个中断服务程序:应⽤程序是⼀个⽆限循环,循环中调⽤API函数完成所需的操作,这个⼤循环就叫做后台系统。
中断服务程序⽤于处理系统的异步事件,也就是前台系统。
前台是中断级,后台是任务级。
2,RTOSRTOS全称为: Real Time OS,就是实时操作系统,强调的是:实时性。
实时操作系统⼜分为硬实时和软实时。
硬实时要求在规定的时间内必须完成操作,硬实时系统不允许超时,在软实时⾥⾯处理过程超时的后果就没有那么严格。
在实时操作系统中,我们可以把要实现的功能划分为多个任务,每个任务负责实现其中的⼀部分,每个任务都是⼀个很简单的程序,通常是⼀个死循环。
RTOS操作系统: UCOS, FreeRTOS, RTX, RT-Thread, DJYOS等。
RTOS操作系统的核⼼内容在于:实时内核。
3,可剥夺型内核RTOS的内核负责管理所有的任务,内核决定了运⾏哪个任务,何时停⽌当前任务切换到其他任务,这个是内核的多任务管理能⼒。
多任务管理给⼈的感觉就好像芯⽚有多个CPU,多任务管理实现了CPU资源的最⼤化利⽤,多任务管理有助于实现程序的模块化开发,能够实现复杂的实时应⽤。
可剥夺内核顾名思义就是可以剥夺其他任务的CPU使⽤权,它总是运⾏就绪任务中的优先级最⾼的那个任务UCOS系统简介UCOS是Micrium公司出品的RTOS类实时操作系统, UCOS⽬前有两个版本:UCOSII和UCOSIII。
UCOSIII是⼀个可裁剪、可剥夺型的多任务内核,⽽且没有任务数限制。
UCOSIII提供了实时操作系统所需的所有功能,包括资源管理、同步、任务通信等。
UCOSIII是⽤C和汇编来写的,其中绝⼤部分都是⽤C语⾔编写的,只有极少数的与处理器密切相关的部分代码才是⽤汇编写的, UCOSIII结构简洁,可读性很强!最主要的是⾮常适合初次接触嵌⼊式实时操作系统学⽣、嵌⼊式系统开发⼈员和爱好者学习。
UCOS III 配置与初始化
/********************************************************************
********************************************************
void OSIntExit (void)
{
CPU_SR_ALLOC();
*/
if (p_stk != (CPU_STK *)0) {
/*关于 OSCfg_ISRStkBasePtr 我也不是很清楚,不用也行*/ size = OSCfg_ISRStkSize;
/*在 os_cfg_app.c 中有定义 CPU_STK* const OSCfg_ISRStkBasePtr= (CPU_STK*)&OSCfg_ISRStk[0];*/
return;
}
#endif
#if OS_CFG_TMR_EN > 0u
/* Initialize the Timer Manager module
*/
OS_TmrInit(p_err);
if (*p_err != OS_ERR_NONE) {
return;
}
#endif
#if OS_CFG_DBG_EN > 0u OS_Dbg_Init();
}
#endif
OS_IdleTaskInit(p_err); /* 初始化空任务,一般没有别的任务工作的话,就由它来占 CPU,空任务 的优先级要最低*/ if (*p_err != OS_ERR_NONE) {
return; }
OS_TickTaskInit(p_err);
/* 初始化时钟节拍函数
UCOSIII任务管理III
UCOSIII任务管理III重点在于第三部分代码讲解•UCOSIII可剥夺型内核调度一、任务级调度器OS_Sched(),在OSTimeDlyHMSM中调用了该函数二、中断级调度器OSInitExit(),在退出中断的时候,启动任务调度。
1、释放信号量或者发送消息,也可通过配置相应的参数不发生任务调度。
2、使用延时函数OSTimeDly()或者OSTimeDlyHMSM()。
Dly()是时间延迟,DlyHMSM()是按节拍延迟delay_ms()封装了TimeDly3、任务等待的事情还没发生(等待信号量,消息队列等)。
4、任务取消等待。
5、创建任务。
6、删除任务。
7、删除一个内核对象。
8、任务改变自身的优先级或者其他任务的优先级。
9、任务通过调用OSTaskSuspend()将自身挂起。
10、任务解挂某个挂起的任务。
11、退出所有的嵌套中断。
12、通过OSSchedUnlock()给调度器解锁。
13、任务调用OSSchedRoundRobinYield()放弃其执行时间片。
14、用户调用OSSched()。
OSSchedLock()上锁OSSchedUnlock()解锁•时间片轮转调度器为:OS_SchedRoundRobin()•任务可以主动放弃时间片任务切换是任务调度的一部分任务切换分为两种:任务级切换和中断级切换。
任务级切换函数为:OSCtxSw()。
中断级切换函数为:OSIntCtxSw()。
OS_ERR err;...OSInit(&err); //OSInit(&err)必须先于其他所有函数执行OS_CRITICAL_ENTER(); //进入临界区OSTaskCreate();OS_CRITICAL_EXIT(); //退出临界区...OSStart(&err);•临界区是用于保护代码不被打断的代码讲解在于理清该函数的思路。
部分代码会省略中文备注的是讲解部分void OSInit (OS_ERR *p_err){CPU_STK *p_stk;CPU_STK_SIZE size;/*检查参数是否合格*/#ifdef OS_SAFETY_CRITICALif (p_err == (OS_ERR *)0) {OS_SAFETY_CRITICAL_EXCEPTION();return;}#endifOSInitHook(); /* Call port specific initialization code */OSIntNestingCtr = (OS_NESTING_CTR)0; /* Clear the interrupt nesting counter *//*标识操作系统是否在运行*/OSRunning = OS_STATE_OS_STOPPED; /* Indicate that multitasking not started */OSSchedLockNestingCtr = (OS_NESTING_CTR)0; /* Clear the scheduling lock counter */OSTCBCurPtr = (OS_TCB *)0; /* Initialize OS_TCB pointers to a known state */OSTCBHighRdyPtr = (OS_TCB *)0;/*=============此处省略部分初始化,暂时不讲解==============================*//*优先级位映射表初始化,在任务管理(中)中进行了讲解*/OS_PrioInit(); /* Initialize the priority bitmap table *//*任务就绪队列,在任务管理(中)中进行了讲解*/OS_RdyListInit(); /* Initialize the Ready List *//*内存管理初始化*/#if OS_CFG_MEM_EN > 0u /* Initialize the Memory Manager module */OS_MemInit(p_err);if (*p_err != OS_ERR_NONE) {return;}#endif/*消息池初始化*/#if (OS_MSG_EN) > 0u /* Initialize the free list of OS_MSGs */OS_MsgPoolInit(p_err);if (*p_err != OS_ERR_NONE) {return;}#endif/*互斥量初始化*/#if OS_CFG_MUTEX_EN > 0u /* Initialize the Mutex Manager module */OS_MutexInit(p_err);if (*p_err != OS_ERR_NONE) {return;#endif/*消息队列初始化*/#if OS_CFG_Q_EN > 0uOS_QInit(p_err); /* Initialize the Message Queue Manager module */if (*p_err != OS_ERR_NONE) {return;}#endif/*信号量初始化*/#if OS_CFG_SEM_EN > 0u /* Initialize the Semaphore Manager module */OS_SemInit(p_err);if (*p_err != OS_ERR_NONE) {return;}#endif/*=============省略了task一些初始化,暂时不讲解==============================*//*空闲任务初始化,优先级MAX-1*/OS_IdleTaskInit(p_err); /* Initialize the Idle Task */if (*p_err != OS_ERR_NONE) {return;}/*时钟节拍任务初始化*/OS_TickTaskInit(p_err); /* Initialize the Tick Task */if (*p_err != OS_ERR_NONE) {return;}/*=============省略了一些初始化,暂时不讲解==============================*/OSCfg_Init();}通过如上OSInit对操作系统运行所需要的资源进行了准备•本质是开始运行就绪队列中最高优先级的任务void OSStart (OS_ERR *p_err){/*检查参数合法性*/#ifdef OS_SAFETY_CRITICALif (p_err == (OS_ERR *)0) {OS_SAFETY_CRITICAL_EXCEPTION();return;}#endifif (OSRunning == OS_STATE_OS_STOPPED) {/*找到就绪队列中最高优先级任务*/OSPrioHighRdy = OS_PrioGetHighest(); /* Find the highest priority */OSPrioCur = OSPrioHighRdy;OSTCBHighRdyPtr = OSRdyList[OSPrioHighRdy].HeadPtr;OSTCBCurPtr = OSTCBHighRdyPtr;OSRunning = OS_STATE_OS_RUNNING;/*开始执行*/OSStartHighRdy(); /* Execute target specific code to start task */*p_err = OS_ERR_FATAL_RETURN; /* OSStart() is not supposed to return */} else {*p_err = OS_ERR_OS_RUNNING; /* OS is already running */}}。
uC-OS-III的特点
uC/OS-III的特点uC/OS-III简介uC/OS-III(Micro C OS Three 微型的C 语言编写的操作系统第3版)是一个可升级的,可固化的,基于优先级的实时内核。
它对任务的个数无限制。
uC/OS-III 是一个第3 代的系统内核,支持现代的实时内核所期待的大部分功能。
例如资源管理,同步,任务间的通信等等。
然而,uC/OS-III 提供的特色功能在其它的实时内核中是找不到的,比如说完备的运行时间测量性能,直接地发送信号或者消息到任务,任务可以同时等待多个内核对象等。
uC/OS-III 是一个可扩展的,可固化的,抢占式的实时内核,它管理的任务个数不受限制。
它是第三代内核,提供了现代实时内核所期望的所有功能包括资源管理、同步、内部任务交流等。
uC/OS-III 也提供了很多特性是在其他实时内核中所没有的。
比如能在运行时测量运行性能,直接得发送信号或消息给任务,任务能同时等待多个信号量和消息队列。
uC/OS-III主要特点1、时间片轮转调度:uC/OS-III 允许多个任务拥有相同的优先级。
当多个相同优先级的任务就绪时,并且这个优先级是目前最高的。
uC/OS-III 会分配用户定义的时间片给每个任务去运行。
每个任务可以定义不同的时间片。
当任务用不完时间片时可以让出CPU 给另一个任务。
2、抢占式多任务处理:uC/OS-III 是一个抢占式多任务处理内核,因此,uC/OS-III 正在运行的经常是最重要的就绪任务。
3、快速响应中断:uC/OS-III 有一些内部的数据结构和变量。
uC/OS-III 保护临界段可以通过锁定调度器代替关中断。
因此关中断的时间会非常少。
这样就使uC/OS-III 可以响应一些非常快的中断源了。
4、确定性的:uC/OS-III 的中断响应时间是可确定的,uC/OS-III 提供的大部分服务的执行时间也是可确定的。
5、易移植的:uC/OS-III 可以被移植到大部分的CPU 架构中。
ucosiii操作系统的执行流程
ucosiii操作系统的执行流程下载温馨提示:该文档是我店铺精心编制而成,希望大家下载以后,能够帮助大家解决实际的问题。
文档下载后可定制随意修改,请根据实际需要进行相应的调整和使用,谢谢!并且,本店铺为大家提供各种各样类型的实用资料,如教育随笔、日记赏析、句子摘抄、古诗大全、经典美文、话题作文、工作总结、词语解析、文案摘录、其他资料等等,如想了解不同资料格式和写法,敬请关注!Download tips: This document is carefully compiled by theeditor.I hope that after you download them,they can help yousolve practical problems. The document can be customized andmodified after downloading,please adjust and use it according toactual needs, thank you!In addition, our shop provides you with various types ofpractical materials,such as educational essays, diaryappreciation,sentence excerpts,ancient poems,classic articles,topic composition,work summary,word parsing,copy excerpts,other materials and so on,want to know different data formats andwriting methods,please pay attention!深入解析UCOSIII操作系统执行流程UCOSIII,全称为μC/OS-III,是一款实时嵌入式操作系统,广泛应用于微控制器和嵌入式系统中。
uCOSIII的消息队列处理机制(红黑联盟)
uCOSIII的消息队列处理机制(红黑联盟)在uC/OSIII中没有邮箱这个概念,而是统一合并到了消息队列MSG_Q。
因为消息队列可以看作是很多邮箱的集合,邮箱只是包含单个消息的消息队列。
在分析消息队列之前,必须要对消息的数据结构做一个彻底的分析。
消息队列对象和其他内核对象一样,它的结构定义很简单:下面看一下消息队列的结构体,记住这个结构体名字叫OS_Q:struct os_q { /* Message Queue */OS_OBJ_TYPE Type; /* Should be set to OS_OBJ_TYPE_Q */ CPU_CHAR *NamePtr; /* Pointer to Message Queue Name (NUL terminated ASCII) */OS_PEND_LIST PendList; /* List of tasks waiting on message queue */OS_MSG_Q MsgQ; /* List of messages */};typedef struct os_q OS_Q;在应用程序中创建消息队列的时候,就是要定义这样的一个结构体变量:举例创建过程如下:OS_Q taskq;void main(){OS_ERR err;OSQCreate ((OS_Q *)&p_q,(CPU_CHAR *)"my task Q",(OS_MSG_QTY) 10,(OS_ERR *)&err );}这样一个消息队列就创建好了。
这里要注意:OS_Q taskq;这句话应该是全局变量,因为通常都要在其他函数中访问。
有时不注意,很容易依照OSQCreate 的参数创建成这样的队列变量:OS_Q * taskq;注意这样创建的只是个指针,并没有实体,这样的定义在OSQCreate中参数传入时不会出错,但一运行就会进入hard fault,因为指针跑飞了。
【ucos-III教程】第11章
【ucos-III教程】第11章 uCOS-III内核函数分析(上)第11章 uCOS-III内核函数分析(上)本期教程开始分析µCOS-III的内核函数,源码的分析采⽤先对源码进⾏注释,然后讲解函数实现的功能和相关的原理分析,最后是举⼀个例⼦(如果这个函数是供外部函数调⽤的)。
内核函数很重要,是学习任务管理,任务间通信机制的基础。
希望初学的同学认真学习,这部分应该算是µCOS-III的核⼼代码。
11.1系统配置⽂件11.2源码⽂件11.3µCOS-III初始化11.4µCOS-III启动11.5获取系统版本11.6空闲任务11.7临界段11.8安全关键IEC6150811.9任务切换11.10调度锁11.11 Round-Robin调度11.12总结11.1 系统配置⽂件下⾯先简单说明下µCOS-III中⼏个配置⽂件的作⽤,⽅便分析源码的时候查看,配置⽂件主要有以下⼏个:11.1.1 lib_cfg.h配置⽂件lib_cfg.h⽂件内容如下:#ifndef LIB_CFG_MODULE_PRESENT#define LIB_CFG_MODULE_PRESENT#define LIB_MEM_CFG_ARG_CHK_EXT_EN DEF_ENABLED#define LIB_MEM_CFG_OPTIMIZE_ASM_EN DEF_ENABLED#define LIB_MEM_CFG_ALLOC_EN DEF_ENABLED#define LIB_MEM_CFG_HEAP_SIZE 23u * 1024u#endiflib_cfg.h是⽤于给uC/LIB做配置的头⽂件。
如果程序中使⽤uC/LIB的话,需要调⽤函数Mem_Init()进⾏初始化。
11.1.2 os_cfg.h配置⽂件os_cfg.h⽂件中的内容如下:#ifndef OS_CFG_H#define OS_CFG_H#define OS_CFG_APP_HOOKS_EN 1u#define OS_CFG_ARG_CHK_EN 1u#define OS_CFG_CALLED_FROM_ISR_CHK_EN 1u#define OS_CFG_DBG_EN 1u#define OS_CFG_ISR_POST_DEFERRED_EN 0u#define OS_CFG_OBJ_TYPE_CHK_EN 1u#define OS_CFG_TS_EN 1u#define OS_CFG_PEND_MULTI_EN 1u#define OS_CFG_PRIO_MAX 64u#define OS_CFG_SCHED_LOCK_TIME_MEAS_EN 0u#define OS_CFG_SCHED_ROUND_ROBIN_EN 0u#define OS_CFG_STK_SIZE_MIN 64u#define OS_CFG_FLAG_EN 1u#define OS_CFG_FLAG_DEL_EN 1u#define OS_CFG_FLAG_MODE_CLR_EN 1u#define OS_CFG_FLAG_PEND_ABORT_EN 1u#define OS_CFG_MEM_EN 1u#define OS_CFG_MUTEX_EN 1u#define OS_CFG_MUTEX_DEL_EN 1u#define OS_CFG_MUTEX_PEND_ABORT_EN 1u#define OS_CFG_Q_EN 1u#define OS_CFG_Q_DEL_EN 1u#define OS_CFG_Q_FLUSH_EN 1u#define OS_CFG_Q_PEND_ABORT_EN 1u#define OS_CFG_SEM_EN 1u#define OS_CFG_SEM_DEL_EN 1u#define OS_CFG_SEM_PEND_ABORT_EN 1u#define OS_CFG_SEM_SET_EN 1u#define OS_CFG_STAT_TASK_EN 1u#define OS_CFG_STAT_TASK_STK_CHK_EN 1u#define OS_CFG_TASK_CHANGE_PRIO_EN 1u#define OS_CFG_TASK_DEL_EN 1u#define OS_CFG_TASK_Q_EN 1u#define OS_CFG_TASK_Q_PEND_ABORT_EN 1u#define OS_CFG_TASK_PROFILE_EN 1u#define OS_CFG_TASK_REG_TBL_SIZE 1u#define OS_CFG_TASK_SEM_PEND_ABORT_EN 1u#define OS_CFG_TASK_SUSPEND_EN 1u#define OS_CFG_TIME_DLY_HMSM_EN 1u#define OS_CFG_TIME_DLY_RESUME_EN 1u#define OS_CFG_TMR_EN 1u#define OS_CFG_TMR_DEL_EN 1u#endif这个配置⽂件⽐较的重要,主要⽤于µCOS-III源码中相关函数的配置。
UCOS—III-常用资料整理
UC/OS—III的常用资料整理任务堆栈:存储任务中的调用的函数、局部变量、中断服务程序和CPU寄存器的值。
全局变量的保护:1.如果只在一个任务中写(或只有一个数据),而在其他任务中只是读取,则可以不用互斥型信号量,最多会造成读取的数据未被完全写完。
2.如果全局变量在多个任务中写,则需要用互斥型信号量保护,这样当有任务申请到互斥型信号量(保护不可重入的程序段)写数据时,其他任务的同一个互斥型信号量必须等待上一个任务的释放才可进行写。
3.如果全局变量在中断中写,则在其他任务中的全局变量的写操作要用临界段(禁止中断和禁止调度:保护不可被分割的程序段)保护。
(因为如果不关中断相当于中断的优先级最高,而且不能被像其他任务那样挂起。
)OS_CFG_ISR_POST_DEFERRED_EN为1临界段使用锁调度器方式;为0临界段使用禁中断方式(CPU_SR_ALLOC();存放中断的变量OS_CRITICAL_ENTER();OS_CRITICAL_EXIT();OS_CRITICAL_EXIT_NO_SCHED();OSSchedLockNestingCtr记录调度器被锁的次数)。
检测任务堆栈的使用情况:OS_CFG_STAT_TASK_STK_CHK_EN使能OS_ERRerr;CPU_STK_SIZE stk_free;CPU_STK_SIZE stk_used;OSTaskStkChk(&TaskBStkTCB,&stk_free,&stk_used,&err);中断中使用OSIntEnter(); 和OSIntExit();是为了退出中断后执行中断调度操作,如果中断中并未用到OSSemPost();等系统函数,则退出中断服务程序后不需要进行任务调度,就可以不在中断服务程序中使用OSIntEnter(); 和OSIntExit();。
(有时候用:CPU_CRITICAL_ENTER();OSIntNestingCtr++;CPU_CRITICAL_EXIT();替代OSIntEnter();)一、变量类型在cpu.h中是有关cpu变量的重新定义,还包括CPU_STK(CPU堆栈类型),和CPU_STK_SIZE(CPU堆栈类型的大小)的定义,CPU_SR(CPU状态寄存器的定义)。
ucosIII移植教程
ucosIII移植教程作者:毕晨光QQ:448251593背景和环境 (2)一、获取源文件 (2)二、建立一个最简单的gpio工程 (2)三、移植ucosIII (9)四、测试OS (14)背景和环境工作很久了,一直在用ucosIII,以前移植过ucosII,也看过别人写的教程移植过ucosIII,但是一直想自己移植一下ucosIII,然后把自己的移植体会写出来.供大家一起学习.环境:iar6.0, stm32lib_v3.5, ucosIII.一、获取源文件获取stm32库文件v3.5.地址: /down_6273773.html获取ucosIII的源码. 地址: /down_6273751.html这是一个.exe的文件.需要运行解压到指定的目录.(我解压到C盘,默认),如下图:以上文件若你都有就不必下载二、建立一个最简单的gpio工程在D盘(可按需)建立一个stm32_ucosIII的目录,然后在其里面建立一个App目录,将STM32 v3.5固件库…\STM32F10x_StdPeriph_Lib_V3.5.0\Project\STM32F10x_StdPeriph_Examples\GPIO\IOTo ggle下面的文件都拷贝到App下面然后把stm32的库拷贝到stm32_ucosIII目录打开IAR软件Project->Create New Project然后按照下图建立分组然后添加源文件如下图些,iar的设置比较多下面开始了(我的是stm32107xC)然后切换到下图:选中箭头指示的Use CMSIS(告诉iar我们用stm32库)接着切换到下图:这里的Level是iar对代码的优化等级,你可以默认(我选择的最高优化等级优化大小)在切换到下图:图中”1”这里设置头文件的路径,把工程相关的文件夹只要包含.h的文件的文件夹的路径都添加上,$PROJ_DIR$这个符号的意思是你的工程保存的路径,你可以直接把英文翻译过来就是这个意思了PROJ 和DIR 分别是project、directory的前几个字母组合起来的,”\..\”表示是从工程目录的转到上一级目录$PROJ_DIR$\$PROJ_DIR$\App$PROJ_DIR$\Libraries\CMSIS\CM3\DeviceSupport\ST\STM32F10x$PROJ_DIR$\Libraries\STM32F10x_StdPeriph_Driver\inc图中“2”的地方预定义一个宏USE_STDPERIPH_DRIVER这个宏是stm32库的开关也可以在其它地方定义接着切换到下图:调试选择j-link/j-trace现在所有的设置都已完成现在打开main.c文件找到#include "stm32_eval.h"然后删除然后在点击main.c前面的加号”+”找到stm32f10.h双击进入文件65行选择一个芯片容量(行号可通过菜单Tools->option->Editor->show line numbers)在菜单选择project->rebuild all在或者用下图方法:弹窗保存窗口这里可能会出现错误, 这个错误说的是没有指定一款芯片双击错误定位到错误的位置,然后找到第65行.你会发现有芯片定义但是全部是注释状态根据你的芯片的容量打开一个注释.我的是STM32F10X_CL在编译一次OK.一个错误都没有.进入main.c文件主函数吧里面的内容都删除掉,只剩下一个while(1),以备后面移植ucosIII使用,如下图:此时其实我挺纠结是开始ucos移植还是先把stm32的systick中断配置好.想来想去还是先把systick这个内核定时器配置好吧.这个是ucos的心跳.我们在main函数里面加上两句程序用于初始化systick的.systick 定时具体的寄存器请参照stm32 的数据手册SysTick_CLKSourceConfig(SysTick_CLKSource_HCLK_Div8);SysTick_Config(9000);/*配置systick周期1ms*/打开stm32f10x_it.c文件的139行在里面添加几条空语句,设置一个断点.仿真运行看systick是否工作运行效果如下图三、移植ucosIII现在我们开始正式移植ucosIII,打开我们的工程目录,按照下图操作,然后把源码包里面的BSP目录下面的bsp.c和bsp.h两个文件copy到我们新建的Bsp目录下拷贝后现在源文件都搞定了.就差添加到工程里面了,回到IAR建立相应分组具体看下图然后添加文件添加完所有的文件,然后打开IAR工程选项设置路径,以下是新增加的文件夹路径$PROJ_DIR$\Bsp$PROJ_DIR$\uC-CPU$PROJ_DIR$\uC-CPU\Cfg\Template$PROJ_DIR$\uC-CPU\ARM-Cortex-M3\IAR$PROJ_DIR$\uC-LIB$PROJ_DIR$\uC-LIB\Cfg\Template$PROJ_DIR$\uCOS-III\Cfg\Template$PROJ_DIR$\uCOS-III\Ports\ARM-Cortex-M3\Generic\IAR$PROJ_DIR$\uCOS-III\Source现在开始修改文件,进入bsp.c文件163行,把BSP_Init()函数内容都删除掉然后在头文件的位置加入#include "stm32f10x.h"进入stm32f10x_it.c文件130行把PendSV_Handler()函数屏蔽掉139行把SysTick_Handler()函数也屏蔽掉,如下图接下来进入os_cpu_c.c文件355行把函数名修改掉→然后进入os_cpu.h文件133行两个函数名修改→接下来进入os_cpu_a.asm文件38行→133行→至此移植算是告一段落.编译一下.会出现错误提示不能打开这个头文件这个是app的所以我们双击错误定位到错误位置把这句删除即可这个错误时不能打开os_type.h 文件所以我们去ucosIII的源码目录下找到这个文件拷贝到我们的工程目录下的App下在次编译….还是有错误.提示处理方法同上下面这个错误提示一个使能开关没打开进入cpu_cfg.h文件99行.改为下图编译….这次只剩下一个错误.也是头文件出错.直接删除包含语句即可下面这个错误重复的定义了同意个函数名称解决方法直接双击下面的出现下图,在exclude from build 前打√,不在编译这个文件接下来再次编译此时只剩下2个警告.是2个函数声明为静态却没有被调用过.这个可以直接去掉函数前面的static (注意.函数的声明和原形都要去掉.否则会出现不一致的错误),当然你也可以不理会这个警告四、测试OS打开main.c文件在24行添加#include "os.h"37行添加CPU_STK AppTaskStk[128];OS_TCB AppTaskTCB;void AppTask(void *p_arg);main()函数添加OS_ERR err;CPU_IntDis();SysTick_CLKSourceConfig(SysTick_CLKSource_HCLK_Div8);/*配置systick的时钟源为hclk8分频*/SysTick_Config(9000); /*配置systick的时钟周期1ms*/OSInit(&err); /*初始化OS*/OSTaskCreate((OS_TCB *)&AppTaskTCB, /* Create the task */(CPU_CHAR *)"App Task",(OS_TASK_PTR )AppTask,(void *)0,(OS_PRIO )12,(CPU_STK *)&AppTaskS tk[0],(CPU_STK_SIZE)128/10,(CPU_STK_SIZE)128,(OS_MSG_QTY )0,(OS_TICK )0,(void *)0,(OS_OPT )OS_OPT_TASK_STK_CHK | OS_OPT_TASK_STK_CLR,(OS_ERR *)&err);OSStart(&err); /*启动OS*/然后在加入任务函数原形/*** @brief Main program.* @param None* @retval None*/void AppTask(void *p_arg){OS_ERR err;static char t = 0;while(1){if (t){t = 0;asm("nop");OSTimeDly(200, OS_OPT_TIME_DLY, &err);}else{t = 1;asm("nop");asm("nop");asm("nop");OSTimeDly(100, OS_OPT_TIME_DLY, &err);}}}具体截图:编译下载运行两个断点都可以运行到.说明ucos移植完成了.这里建立了一个简单的任务.测试了ucosIII的移植.移植过程中很多函数都没有用ucosIII的函数项系统的systick函数的初始化,还有把所有的中断函数重新映射一遍等等.具体请读者自己研究.12/21/2012 6:03 PM。
uCOS_3_zuozhexu
译者序Jean J. Labrosse 的µC/OS-II 是我国计算机嵌入式应用领域读者最喜爱的实时操作系统 (RTOS)。
十多年前,我们曾将他的“MicroC/OS-II,The Real-Time Kernel”及其第二版译成中文。
现在,我们又将他的近作“µC/OS-III,The Real-Time Kernel”译成中文献给读者,希望读者喜爱。
从µC/OS,到µC/OS-II,再到今天的µC/OS-III,经过了20年的发展,已经成为得到广泛认可的、高可靠性的、有商业价值的嵌入式RTOS。
为了便于我国年轻读者学习,这里简单介绍一下从µC/OS到µC/OS-III传入我国的情况。
作为一名嵌入式应用工程师,作者在1992年出版了一本关于RTOS的书“µC/OS,The Real-Time Kernel”,该书仅261页,其中约100页是那个名为µC/OS的小实时内核的源代码。
那个年代商业版的RTOS还很神秘,有的还是“黑盒子”,即不提供源码。
该书最早进入我国可能是1995年,欧洲核研究中心(CERN)的专家将这本书推荐给国际理论物理中心(ICTP),作为“第4届RTOS在物理学中的应用”培训班的教材。
这个国际培训班的学员主要来自发展中国家。
我们从那时起开始研究、使用µC/OS。
由于版权购买问题,没能翻译出版。
2000年北京召开首届嵌入式RTOS应用大会时,我们介绍了在核领域教学和科研中使用µC/OS的情况。
而此时原文的“MicroC/OS-II”已经出版了。
2001年我们把这本书译成中文,由中国电力出版社出版。
不久后,2002年“MicroC/OS-II,The Real-Time Kernel(Second Edition)”一书又出版了。
该书附有一张光盘,提供的是µC/OS-II V2.04的源码。
uCosIII学习
uCosIII 学习本人前言:很久没有练习英语了,本想发点时间在工作之余,翻译一下μC/OS III用户手册,发现还是有点吃力,于是乎,参见网络上的嘉兴学院的屈环宇同学的译本,谢谢!前言做为Micrium公司推出的第三代操作系统,μC/OS III 支持现代的实时内核所期待的大部分功能;μC/OS III是一个可裁剪、可固化、基于优先级的实时内核,支持例如资源管理、同步、任务间的通信等等。
同时μC/OS III也具备一些很有特色的功能,是很多的其他的实时内核所不具备的,比如完备的实际测量性能、直接发送信号或消息到任务、任何可同时等待多个内核对象等。
与第二代μC/OS II相比,μC/OS III更加优秀,μC/OS III中删除或更新了μC/OS II中很少使用的一些功能;添加了更高效的功能和服务,比如时间片轮转调度(round robin)等,μC/OS II最多支持64个任务,而μC/OS III在理论上任务数量没有限第一章介绍实时系统软实时系统和硬实时系统的区别在于一旦没有在规定的时间内完成任务所导致后果的严重性。
超过时限后所得到的结果即使正确也可能是毫无作用的。
硬实时系统中,运算超时是不允许发生的。
在很多情况下,超时会导致巨大的灾难,会威胁人们的生命安全。
但是在软实时系统中,超时不会导致严重后果。
前后台系统简单的小型系统设计一般是基于前后台的或者无限循环的系统。
包含一个无限循环的模块实现需要的操作(后台)。
中断处理程序实现异步事件(前台)。
前台也叫做中断级,后台也叫作任务级。
多数高产量低成本微控制器的应用软件(例如微波炉,电话玩具等)都是基于前后台系统的。
实时内核实时内核是一个能管理MPU、MCU、DSP时间和资源的软件。
实时内核的应用包括迅速地响应,可靠地完成工作的各个部分。
嵌入式实时操作系统uCOS-III
目录第一部分:μC/OS-III 实时内核μC/OS-III的演变—Jack Ganssle前言第1章概述1-1前后台系统1-2实时内核1-3RTOS(实时操作系统)1-4μC/OS-III1-5μC/OS,μC/OS-II,μC/OS-III特性比较1-6关于本书1-7μC/Probe 调试软件工具1-8本书的常用约定1-9各章内容第2章目录和文件2-1 应用代码2-2 CPU2-3 板级支持包(BSP)2-4 μC/OS-III,与CPU无关的源代码2-5 μC/OS-III,与CPU相关的源代码2-6 μC/CPU,与CPU相关的源代码2-7 μC/LIB,可移植的库函数2-8 小结第3章初识μC/OS-III3-1 单任务应用程序3-2 有内核对象参与的多任务应用程序第4章临界段代码4-1 关中断4-1-1 测量中断关闭时间4-2 给调度器上锁4-2-1 测量调度器锁定时间4-3 μC/OS-III的某些功能会导致临界段代码长度增加4-4 小结第5章任务管理5-1 任务优先级的分配5-2 栈空间大小的确定5-3 任务栈溢出检测5-4 任务管理函数5-5 任务管理的内部原理5-5-1 任务状态5-5-2 任务控制块TCB5-6 系统内部任务5-6-1 空闲任务(OS_IdleTask(),os_core.c)5-6-2 时钟节拍任务(OS_TickTask(), os_tick.c)5-6-3 统计任务(OS_StatTask(),os_stat.c)5-6-4 定时任务(OS_TmrTask(),os_tmr.c)5-6-5 中断服务管理任务(OS_IntQTask(),os_int.c)5-7小结第6章任务就绪表6-1 优先级6-2 就绪任务列表6-3 向就绪任务列表中增加任务6-4小结第7章任务调度7-1 可剥夺型调度7-2 调度点7-3 时间片轮转调度7-4 调度的实现细节7-4-1 OSSched()7-4-2 OSIntExit()7-4-3 OS_SchedRoundRobin()7-5 小结第8章任务切换8-1 OSCtxSw()8-2 OSIntCtxSw()8-3小结第9章中断管理9-1 CPU的中断处理9-2 典型的μC/OS-III中断服务程序9-3 无需内核参与的中断服务程序9-4 多中断优先级的处理器9-5 所有中断源共用中断服务程序9-6 每个中断源都有专用中断服务程序9-7 直接发布和延时发布9-7-1 直接发布9-7-2 延迟发布9-8 直接发布模式和延迟发布模式的对比9-9 时钟节拍(也称为系统节拍)9-10小结第10章任务挂起表10-1 小结第11章时间管理11-1 OSTimeDly()11-2 OSTimeDlyHMSM()11-3 OSTimeDlyResume()11-4 OSTimeSet() 和OSTimeGet()11-5 OSTimeTick()11-6 小结第12章定时器管理12-1 单次定时器12-2 周期定时器(无初始延迟)12-3 周期定时器(有初始延迟)12-4 定时器管理内部机制12-4-1 定时器管理内部机制——定时器状态12-4-2 定时器管理内部机制——OS_TMR12-4-3 定时器管理内部机制——定时器任务12-4-4 定时器管理内部机制——定时器列表12-5 总结第13章资源管理13-1 关中断/开中断13-2 给调度器上锁/开锁13-3 信号量13-3-1 二进制信号量13-3-2 计数型信号量13-3-3 使用信号量的注意事项13-3-4 (用来共享资源的)信号量内部结构13-3-5 优先级反转13-4 互斥型信号量(MUTEX)13-4-1 互斥型信号量内部结构13-5 何时可以用普通信号量替代互斥型信号量13-6 死锁(或称抱死)13-7 小结第14章任务同步14-1 信号量14-1-1 单向同步14-1-2 信用记录14-1-3 多个任务等待同一个信号量14-1-4 信号量的内部结构(以同步为目的)14-2 任务信号量14-2-1 等待任务信号量14-2-2 发布任务信号量14-2-3 双向同步14-3 事件标志组14-3-1 使用事件标志14-3-2 事件标志的内部结构14-4 与多任务同步14-5 小结第15章消息传递15-1 消息15-2 消息队列15-3 任务内建的消息队列15-4 双向同步15-5 流量控制(flow control)15-6 保持数据的可见性15-7 使用消息队列15-8 客户端和服务器15-9 消息队列内部的细节15-10 小结第16 章同时等待多个内核对象16-1 小结第17章存储管理17-1 创建存储分区17-2 从分区中获得存储块17-3 将存储块归还到分区中17-4 使用存储分区17-5 小结第18章移植µC/OS-Ⅲ18-1 约定18-2 μC/CPU18-2-1 CPU_BSP.H18-2-2 CPU_DEF.H18-2-3 CPU_CFG.H18-2-4 CPU_CORE.C18-2-5 CPU_CORE.H18-2-6 CPU.H18-2-7 CPU_C.C18-2-8 CPU_A.ASM18-3 μC/OS-III移植18-3-1 OS_CPU.H18-3-2 OS_CPU_C.C18-3-3 OS_CPU_A.ASM18-3-4 OS_CPU_A.INC18-4 板级支持包(BSP)18-4-1 BSP.C和BSP.H18-4-2 BSP_INT.C和BSP_INT.H18-5 移植的测试18-5-1 创建一个简单的测试工程18-5-2 验证任务级任务切换18-5-3 验证中断级任务切换18-6 小结第19章程序运行时的各类统计信息19-1程序运行时的总体统计19-2 任务运行时的统计19-3 程序运行时和内核对象相关的统计信息19-4 OS_DBG.C –统计19-5 OS_CFG_APP. C –统计19-6 小结附录A μC/OS-III API参考手册A-1 任务管理A-2 时间管理A-3 互斥型信号量——资源管理A-4 事件标志组——同步A-5 信号量——同步A-6 任务信号量——同步A-7 消息队列——消息传递A-8 任务消息队列——消息传递A-9 等待多个对象A-10 定时器A-11 固定大小的存储分区——存储管理A-12 OSCtxSw()A-13 OSFlagCreate()A-14 OSFlagDel()A-15 OSFlagPend()A-16 OSFlagPendAbort()A-17 OSFlagPendGetFlagsRdy()A-18 OSFlagPost()A-19 OSIdleTaskHook()A-20 OSInit()A-21 OSInitHook()A-22 OSIntCtxSw()A-23 OSIntEnter()A-24 OSIntExit()A-25 OSMemCreate()A-26 OSMemGet()A-27 OSMemPut()A-28 OSMutexCreate()A-29 OSMutexDel()A-30 OSMutexPend()A-31 OSMutexPendAbort()A-32 OSMutexPost()A-33 OSPendMulti()A-34 OSQCreate()A-35 OSQDel()A-36 OSQFlush()A-36 OSQPend()A-38 OSQPendAbort()A-32 OSQPost()A-41 OSSched()A-42 OSSchedLock()A-43 OSSchedRoundRobinCfg() A-44 OSSchedRoundRobinYield() A-45 OSSchedUnlock()A-46 OSSemCreate()A-47 OSSemDel()A-48 OSSemPend()A-49 OSSemPendAbort()A-50 OSSemPost()A-51 OSSemSet()A-52 OSStart()A-53 OSStartHighRdy()A-54 OSStatReset()A-55 OSStatTaskCPUUsageInit() A-56 OSStatTaskHook()A-57 OSTaskChangePrio()A-58 OSTaskCreate()A-59 OSTaskCreateHook()A-60 OSTaskDel()A-61 OSTaskDelHook()A-62 OSTaskQFlush()A-63 OSTaskQPend()A-64 OSTaskQPendAbort()A-65 OSTaskQPost()A-66 OSTaskRegGet()A-67 OSTaskRegSet()A-68 OSTaskReturnHook()A-69 OSTaskResume()A-70 OSTaskSemPend()A-71 OSTaskSemPendAbort()A-72 OSTaskSemPost()A-73 OSTaskSemSet()74 OSStatTaskHook()A-75 OSTaskStkChk()A-76 OSTaskStkInit()A-77 OSTaskSuspend()A-78 OSTaskSwHook()A-79 OSTaskTimeQuantaSet()A-80 OSTickISR()A-81 OSTimeDly()A-82 OSTimeDlyHMSM()A-83 OSTimeDlyResume()A-84 OSTimeGet()A-85 OSTimeSet()A-86 OSTimeTick()A-87 OSTimeTickHook()A-88 OSTmrCreate()A-89 OSTmrDel()A-90 OSTmrRemainGet()A-91 OSTmrStart()A-92 OSTmrStateGet()A-93 OSTmrStop()A-94 OSVersion()附录B μC/OS-III配置手册B-1 μC/OS-III的功能(os_cfg.h)B-2μC/OS-III的数据类型(os_type.h)B-3 μC/OS-III的堆栈、池和其他数据类型(os_cfg_app.h)附录C从μC/OS-II 迁移到μC/OS-IIIC-1源文件名称和内容的差异C-2编程约定的变化C-3变量名称的变化C-4 API的变化C-4-1事件标志C-4-2消息邮箱C-4-3存储管理C-4-4互斥型信号量C-4-5消息队列C-4-6信号量C-4-7任务管理C-4-8时间管理C-4-9定时器管理C-4-10其他C-4-11介入函数与系统移植附录D MISRA-C:2004和μC/OS-III D-1 MISRA-C:2004,规则8.5 (强制)D-2 MISRA-C:2004,规则8.12(强制)D-3 MISRA-C:2004,规则14.7 (强制)D-4 MISRA-C:2004,规则15.2 (强制)D-5 MISRA-C:2004,规则17.4 (强制)附录E 参考文献附录F μC /OS-III许可政策致中国读者这本书是很多人多年辛勤劳动的结晶,讲述的是一个最早于1992年发布的实时内核的第三代。
17_μCOS-III
Le i)LTK女娲STM32开发板使用手册修订历史L TK (Le iT ek )目录第17 μC/OS-III (3)章 μC/OS -III 简介 (3)17.1 μC/OS -III 是什么 ..................................................................... 3 17.1.1 μC/OS-III 新特性 ..................................................................... 3 17.1.2 μC/OS -III 移植 . (4)17.2 源代码获取 ............................................................................. 4 17.2.1 软件目录结构 ......................................................................... 5 17.2.2 uCOS-III 移植过程 .................................................................. 7 17.2.3 uC-CPU 目录移植 .................................................................. 7 17.2.4 uC-LIB 目录移植 .................................................................... 8 17.2.5 uCOS-CFG 目录移植 .............................................................. 8 17.2.6 uCOS-BSP 目录移植 .............................................................. 8 17.2.7 μC/OS -III 应用实例 ----- 创建LED 跑马灯任务 . (8)17.3 实例描述 ................................................................................ 8 17.3.1 实验效果 ................................................................................ 8 17.3.2 硬件设计 ................................................................................ 9 17.3.3 软件设计 .. (9)17.3.4K (Le iT ek )μC/OS-III第17章 μC/OS-III 简介17.1 μC /OS-III 是什么17.1.1μC/OS-III(发音为Micro C OS Three)是一个可扩展的,可固化的,抢占式的实时内核。
以UCOSIII为例-嵌入式实时操作系统概述
单向同步例子
单向同步例子
多值信号量计数值
多值信号量计数值中保存了它还能被分配多少次 。换句话说,当ISR 提交该信号量n 次,那么该信 号量计数值就会增加n。
多个任务等待一个信号量
多个任务可以同时等待同样的信号量,假设每个 任务都被设置了定时期限。
事件标志组
当任务要与多个事件同步时可以使用事件标志。 若其中的任意一个事件发生时任务被就绪,叫做 逻辑或(OR)。 若所有的事件都发生时任务被就绪,叫做逻辑与 (AND)。 用户可以创建任意个事件标志组(限制于RAM) 。
恢复处于延时状态的任务
获得当前的时基计数值 设置当前的时基计数值
系统时基
uC/OS-III 需要一个能提供周期性时间的时基源 ,叫做系统时基。硬件定时器可以被设置为每秒产 生10 到1000Hz 的中断提供系统时基。 时基可以看做是系统的心跳。它的速率决定于时 基源。然而,时基速率越快,系统的额外支出就越 大。
实时内核
一.任务及其状态
什么是任务
任务(也叫做线程)是简单的程序。单CPU 中 ,在任何时刻只能是一个任务被执行。 任务看起来像C 函数。在大多数嵌入式系统中, 任务通常是无限循环的。任务不能像C 函数那样, 它是不能return 的。
任务的基本样子
任务的创建
一个简单的任务例子
任务状态
五.中断管理
什么是中断
中断是硬件机制,用于通知CPU 有异步事件发 生。当中断被响应时,CPU 保存部分(或全部)寄 存器值并跳转到中断服务程序(ISR)。ISR 响应 这个事件,当ISR 处理完成后,程序会返回中断前 的任务或更高优先级的任务。 在实时系统中,关中断的时间越短越好。长时间 关中断可能会导致中断来不及响应而重叠。
嵌入式实时操作系统uCOS-III
目录第一部分:μC/OS-III 实时内核μC/OS-III的演变—Jack Ganssle前言第1章概述1-1前后台系统1-2实时内核1-3RTOS(实时操作系统)1-4μC/OS-III1-5μC/OS,μC/OS-II,μC/OS-III特性比较1-6关于本书1-7μC/Probe 调试软件工具1-8本书的常用约定1-9各章内容第2章目录和文件2-1 应用代码2-2 CPU2-3 板级支持包(BSP)2-4 μC/OS-III,与CPU无关的源代码2-5 μC/OS-III,与CPU相关的源代码2-6 μC/CPU,与CPU相关的源代码2-7 μC/LIB,可移植的库函数2-8 小结第3章初识μC/OS-III3-1 单任务应用程序3-2 有内核对象参与的多任务应用程序第4章临界段代码4-1 关中断4-1-1 测量中断关闭时间4-2 给调度器上锁4-2-1 测量调度器锁定时间4-3 μC/OS-III的某些功能会导致临界段代码长度增加4-4 小结第5章任务管理5-1 任务优先级的分配5-2 栈空间大小的确定5-3 任务栈溢出检测5-4 任务管理函数5-5 任务管理的内部原理5-5-1 任务状态5-5-2 任务控制块TCB5-6 系统内部任务5-6-1 空闲任务(OS_IdleTask(),os_core.c)5-6-2 时钟节拍任务(OS_TickTask(), os_tick.c)5-6-3 统计任务(OS_StatTask(),os_stat.c)5-6-4 定时任务(OS_TmrTask(),os_tmr.c)5-6-5 中断服务管理任务(OS_IntQTask(),os_int.c)5-7小结第6章任务就绪表6-1 优先级6-2 就绪任务列表6-3 向就绪任务列表中增加任务6-4小结第7章任务调度7-1 可剥夺型调度7-2 调度点7-3 时间片轮转调度7-4 调度的实现细节7-4-1 OSSched()7-4-2 OSIntExit()7-4-3 OS_SchedRoundRobin()7-5 小结第8章任务切换8-1 OSCtxSw()8-2 OSIntCtxSw()8-3小结第9章中断管理9-1 CPU的中断处理9-2 典型的μC/OS-III中断服务程序9-3 无需内核参与的中断服务程序9-4 多中断优先级的处理器9-5 所有中断源共用中断服务程序9-6 每个中断源都有专用中断服务程序9-7 直接发布和延时发布9-7-1 直接发布9-7-2 延迟发布9-8 直接发布模式和延迟发布模式的对比9-9 时钟节拍(也称为系统节拍)9-10小结第10章任务挂起表10-1 小结第11章时间管理11-1 OSTimeDly()11-2 OSTimeDlyHMSM()11-3 OSTimeDlyResume()11-4 OSTimeSet() 和OSTimeGet()11-5 OSTimeTick()11-6 小结第12章定时器管理12-1 单次定时器12-2 周期定时器(无初始延迟)12-3 周期定时器(有初始延迟)12-4 定时器管理内部机制12-4-1 定时器管理内部机制——定时器状态12-4-2 定时器管理内部机制——OS_TMR12-4-3 定时器管理内部机制——定时器任务12-4-4 定时器管理内部机制——定时器列表12-5 总结第13章资源管理13-1 关中断/开中断13-2 给调度器上锁/开锁13-3 信号量13-3-1 二进制信号量13-3-2 计数型信号量13-3-3 使用信号量的注意事项13-3-4 (用来共享资源的)信号量内部结构13-3-5 优先级反转13-4 互斥型信号量(MUTEX)13-4-1 互斥型信号量内部结构13-5 何时可以用普通信号量替代互斥型信号量13-6 死锁(或称抱死)13-7 小结第14章任务同步14-1 信号量14-1-1 单向同步14-1-2 信用记录14-1-3 多个任务等待同一个信号量14-1-4 信号量的内部结构(以同步为目的)14-2 任务信号量14-2-1 等待任务信号量14-2-2 发布任务信号量14-2-3 双向同步14-3 事件标志组14-3-1 使用事件标志14-3-2 事件标志的内部结构14-4 与多任务同步14-5 小结第15章消息传递15-1 消息15-2 消息队列15-3 任务内建的消息队列15-4 双向同步15-5 流量控制(flow control)15-6 保持数据的可见性15-7 使用消息队列15-8 客户端和服务器15-9 消息队列内部的细节15-10 小结第16 章同时等待多个内核对象16-1 小结第17章存储管理17-1 创建存储分区17-2 从分区中获得存储块17-3 将存储块归还到分区中17-4 使用存储分区17-5 小结第18章移植µC/OS-Ⅲ18-1 约定18-2 μC/CPU18-2-1 CPU_BSP.H18-2-2 CPU_DEF.H18-2-3 CPU_CFG.H18-2-4 CPU_CORE.C18-2-5 CPU_CORE.H18-2-6 CPU.H18-2-7 CPU_C.C18-2-8 CPU_A.ASM18-3 μC/OS-III移植18-3-1 OS_CPU.H18-3-2 OS_CPU_C.C18-3-3 OS_CPU_A.ASM18-3-4 OS_CPU_A.INC18-4 板级支持包(BSP)18-4-1 BSP.C和BSP.H18-4-2 BSP_INT.C和BSP_INT.H18-5 移植的测试18-5-1 创建一个简单的测试工程18-5-2 验证任务级任务切换18-5-3 验证中断级任务切换18-6 小结第19章程序运行时的各类统计信息19-1程序运行时的总体统计19-2 任务运行时的统计19-3 程序运行时和内核对象相关的统计信息19-4 OS_DBG.C –统计19-5 OS_CFG_APP. C –统计19-6 小结附录A μC/OS-III API参考手册A-1 任务管理A-2 时间管理A-3 互斥型信号量——资源管理A-4 事件标志组——同步A-5 信号量——同步A-6 任务信号量——同步A-7 消息队列——消息传递A-8 任务消息队列——消息传递A-9 等待多个对象A-10 定时器A-11 固定大小的存储分区——存储管理A-12 OSCtxSw()A-13 OSFlagCreate()A-14 OSFlagDel()A-15 OSFlagPend()A-16 OSFlagPendAbort()A-17 OSFlagPendGetFlagsRdy()A-18 OSFlagPost()A-19 OSIdleTaskHook()A-20 OSInit()A-21 OSInitHook()A-22 OSIntCtxSw()A-23 OSIntEnter()A-24 OSIntExit()A-25 OSMemCreate()A-26 OSMemGet()A-27 OSMemPut()A-28 OSMutexCreate()A-29 OSMutexDel()A-30 OSMutexPend()A-31 OSMutexPendAbort()A-32 OSMutexPost()A-33 OSPendMulti()A-34 OSQCreate()A-35 OSQDel()A-36 OSQFlush()A-36 OSQPend()A-38 OSQPendAbort()A-32 OSQPost()A-41 OSSched()A-42 OSSchedLock()A-43 OSSchedRoundRobinCfg() A-44 OSSchedRoundRobinYield() A-45 OSSchedUnlock()A-46 OSSemCreate()A-47 OSSemDel()A-48 OSSemPend()A-49 OSSemPendAbort()A-50 OSSemPost()A-51 OSSemSet()A-52 OSStart()A-53 OSStartHighRdy()A-54 OSStatReset()A-55 OSStatTaskCPUUsageInit() A-56 OSStatTaskHook()A-57 OSTaskChangePrio()A-58 OSTaskCreate()A-59 OSTaskCreateHook()A-60 OSTaskDel()A-61 OSTaskDelHook()A-62 OSTaskQFlush()A-63 OSTaskQPend()A-64 OSTaskQPendAbort()A-65 OSTaskQPost()A-66 OSTaskRegGet()A-67 OSTaskRegSet()A-68 OSTaskReturnHook()A-69 OSTaskResume()A-70 OSTaskSemPend()A-71 OSTaskSemPendAbort()A-72 OSTaskSemPost()A-73 OSTaskSemSet()74 OSStatTaskHook()A-75 OSTaskStkChk()A-76 OSTaskStkInit()A-77 OSTaskSuspend()A-78 OSTaskSwHook()A-79 OSTaskTimeQuantaSet()A-80 OSTickISR()A-81 OSTimeDly()A-82 OSTimeDlyHMSM()A-83 OSTimeDlyResume()A-84 OSTimeGet()A-85 OSTimeSet()A-86 OSTimeTick()A-87 OSTimeTickHook()A-88 OSTmrCreate()A-89 OSTmrDel()A-90 OSTmrRemainGet()A-91 OSTmrStart()A-92 OSTmrStateGet()A-93 OSTmrStop()A-94 OSVersion()附录B μC/OS-III配置手册B-1 μC/OS-III的功能(os_cfg.h)B-2μC/OS-III的数据类型(os_type.h)B-3 μC/OS-III的堆栈、池和其他数据类型(os_cfg_app.h)附录C从μC/OS-II 迁移到μC/OS-IIIC-1源文件名称和内容的差异C-2编程约定的变化C-3变量名称的变化C-4 API的变化C-4-1事件标志C-4-2消息邮箱C-4-3存储管理C-4-4互斥型信号量C-4-5消息队列C-4-6信号量C-4-7任务管理C-4-8时间管理C-4-9定时器管理C-4-10其他C-4-11介入函数与系统移植附录D MISRA-C:2004和μC/OS-III D-1 MISRA-C:2004,规则8.5 (强制)D-2 MISRA-C:2004,规则8.12(强制)D-3 MISRA-C:2004,规则14.7 (强制)D-4 MISRA-C:2004,规则15.2 (强制)D-5 MISRA-C:2004,规则17.4 (强制)附录E 参考文献附录F μC /OS-III许可政策致中国读者这本书是很多人多年辛勤劳动的结晶,讲述的是一个最早于1992年发布的实时内核的第三代。
UCOSIII移植——STM32F769I图像处理能力评测之五
UCOSIII移植——STM32F769I图像处理能力评测之五硬件平台:STM32F769IDISCOVERY软件平台:KEIL5.1UCOSIII简介:uC/OS-III是一个可扩展的,可固化的,抢占式的实时内核,它管理的任务个数不受限制。
它是第三代内核,提供了现代实时内核所期望的所有功能包括资源管理、同步、内部任务交流等。
uC/OS-III 也提供了很多特性是在其他实时内核中所没有的。
比如能在运行时测量运行性能,直接发送信号或消息给任务,任务能同时等待多个信号量和消息队列。
它与UCOSII的最大不同之处在于:1.对任务数量没有要求,对任务的优先级没有要求,允许存在同一优先级不同的任务。
2.支持时间片轮转。
对相同优先级的任务,允许设置每个任务运行的时间,按顺序执行任务。
3.取消消息邮箱,不通过消息队列发消息给任务,不通过信号量标记任务。
4.支持运行时配置,任务的停止与恢复支持嵌套。
UCOSIII移植:由于我之前第二个评测时,已经创建了一个工程文件,实现了最基本的功能--LED灯的闪烁。
因此,我们依然使用这个工程文件来进行移植,要实现的功能依然是LED灯的闪烁。
好了,接下来开始移植:1.登录MICRIUM官网,下载UCOSIII。
下载地址:/downloadcenter/download-results/?searchterm=mi-stmicroelectronics-stm32f7xx&supported=true。
由于官方基本都是使用IAR平台进行UCOS的移植,并没找到MDK平台的移植,不过没关系,可以下载下来,重新进行移植。
官网移植的芯片针对STM32F746,并没有STM32F769,但是二者都是基于M7内核,除了外设和浮点运算,基本上差异不大。
原版的UCOSIII工程文件,在附件里有提供。
2.打开之前的工程文件,创建一个文件夹,命名为UCOSIII。
然后在里面创建5个子文件夹,依次为APP、BSP、uC_CPU、uC _LIB 和uCOS-III。
UCOSIII任务管理I
UCOSIII任务管理I基于stm32代码讲解本文第一部分:涉及移植后stm32工程中delay.c,usart.c,sys.c 3个源文件中重要的函数说明第二部分:讲解ucos任务管理的基本概念和相关代码帮助理解,包括-1.任务的组成部分2.系统任务3.任务状态4.任务状态的切换第三部分:进行总结归纳和反思1-delay.c在m3,m4中代码完全一样。
在m4权威指南中NVIC和中断一章中Systick有详细讲解滴答定时器void SysTick_Handler(void){if(delay_osrunning==1) //操作系统正常运行后执行{OSIntEnter(); //进入中断OSTimeTick(); //调用ucos中断服务函数OSIntExit(); //触发任务切换软中断(进入就绪态)}}•delay_init,初始化了ucos的时钟节拍•delay_ms在<=最小周期的时候使用原本的函数-不会引起任务调度,在大于的时候使用ucos自带的函数-会引起任务调度•delay_us不会引起任务调度2-usart.c•在中断中要使用ucos特定的中断进入和退出函数void USART1_IRQHandler(void){u8 Res;#if SYSTEM_SUPPORT_OSOSIntEnter(); //使用ucos操作系统#endif....................//自定义的中断处理#if SYSTEM_SUPPORT_OSOSIntExit(); //退出中断(调度优先级最高的任务)#endif}3-sys.c 完全不变1-任务的组成•任务堆栈:上下文切换用于保存任务当前环境。
也就是stm32内部寄存器的值。
•任务控制块:保存任务的各个属性•任务函数:完成指定功能1-1三大组成使用部分代码讲解//任务优先级#define TASK1_TASK_PRIO 4//任务堆栈大小#define TASK1_STK_SIZE 128//任务控制块OS_TCB Task1_TaskTCB;//任务函数CPU_STK TASK1_TASK_STK[TASK1_STK_SIZE];void task1_task(void *p_arg);void XXX_task(void *p_arg){while(1){...//任务处理过程OSTimeDlyHMSM(0,0,1,0,OS_OPT_TIME_HMSM_STRICT,&er r); //延时一秒}}//创建task1任务OSTaskCreate((OS_TCB * )&Task1_TaskTCB, //任务控制块(CPU_CHAR * )"Task1 task",(OS_TASK_PTR )task1_task, //使用任务函数(void * )0,(OS_PRIO )TASK1_TASK_PRIO, //任务优先级(CPU_STK * )&TASK1_TASK_STK[0],//任务堆栈(CPU_STK_SIZE)TASK1_STK_SIZE/10,(CPU_STK_SIZE)TASK1_STK_SIZE,(OS_MSG_QTY )0,(OS_TICK )0,(void * )0,(OS_OPT )OS_OPT_TASK_STK_CHK|OS_OPT_TASK_STK_CL R,(OS_ERR * )&err);2-系统任务1、空闲任务:UCOSIII创建的第一个任务,UCOSIII必须创建的任务,此任务有UCOSIII自动创建,不需要用户手动创建。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
FA_CREATE_ALWAYS, FA_CREATE_NEW, FA_OPEN_ALWAYS 是无效的。 返回值 FR_OK (0) 函数成功,该文件对象有效。 FR_NO_FILE 找不到该文件。 FR_NO_PATH 找不到该路径。 FR_INVALID_NAME 文件名无效。 FR_INVALID_DRIVE 驱动器号无效。 FR_EXIST 该文件已存在。 FR_DENIED 由于下列原因,所需的访问被拒绝:
二、文件的关闭
f_close 关闭一个打开的文件
FRESULT f_close ( FIL * FileObject
/* 文件对象结构的指针 */
); 参数
FileObject 指向将被关闭的已打开的文件对象结构的指针。 返回值 FR_OK (0) 文件对象已被成功关闭。 >FR_DISK_ERR 由于底层磁盘 I/O 函 数中的错误,而导致该函数失败。 FR_INT_ERR 由于一个错误的 FAT 结构或一个内部错误,而导致该函数失败。
res = f_write(&fdst, buffer, br, &bw); if (res || bw < br) break; /* 磁盘满错误 */
} /* 关闭打开的文件 */
f_close(&fsrc);
f_close(&fdst); /* 注销工作区(在废弃前) */ f_mount(0, NULL); f_mount(1, NULL); }
FR_INT_ERR
由于一个错误的 FAT 结构或一个内部错误,而导致该函数失败。 FR_NOT_READY 由于驱动器中没有存储介质或任何其他原因,而导致磁盘驱动器无法工作。 FR_INVALID_OBJECT 文件对象无效。 描述 f_lseek 函数当 FS_MINIMIZE <= 2 时可用。 offset 只能被指定为相对于文件起始处的字节数。当在写模式下指定了一个超过 文件大小的 offset 时,文件的大小将被扩展,并且该扩展的区域中的数据是未定 义的。这适用于为快速写操作迅速地创建一个大的文件。f_lseek 函数成功后, 为了确保读/写指针已被正确地移动,必须检查文件对象中的成员 fptr。如果 fptr 不是所期望的值,则发生了下列情况之一。 文件结束。指定的 offset 被钳在文件大小,因为文件已被以只读模式打开。 磁盘满。卷上没有足够的空闲空间去扩展文件大小。 例子
); 参数
FileObject 将被创建的文件对象结构的指针。
FileName NULL 结尾的字符串指针,该字符串指定了将被创建或打开的文件名。
ModeFlags 指定文件的访问类型和打开方法。它是由下列标志的一个组合指定的。 模式 描述 FA_READ 指定读访问对象。可以从文件中读取数据。
与 FA_WRITE 结合可以进行读写访问。 FA_WRITE 指定写访问对象。可以向文件中写入数据。
); 参数
FileObject 指向将被读取的已打开的文件对象结构的指针。
Buffer 指向存储读取数据的缓冲区的指针。
ByteToRead 要读取的字节数,UINT 范围内。
ByteRead
指向返回已读取字节数的 UINT 变量的指针。在调用该函数后,无论结果如何, 数值都是有效的。
返回值 FR_OK (0) 函数成功。 FR_DENIED 由于文件是以非读模式打开的,而导致该函数被拒绝。 FR_DISK_ERR 由于底层磁盘 I/O 函数中的错误,而导致该函数失败。 FR_INT_ERR 由于一个错误的 FAT 结构或一个内部错误,而导致该函数失败。 FR_NOT_READY 由于驱动器中没有存储介质或任何其他原因,而导致磁盘驱动器无法工作。 FR_INVALID_OBJECT 文件对象无效。 描述 文件对象中的读/写指针以已读取字节数增加。该函数成功后,应该检查 *ByteRead 来检测文件是否结束。在读操作过程中,一旦 *ByteRead < ByteToRead ,则读/写指针到达了文件结束位置。
以写模式打开一个只读文件。 由于存在一个同名的只读文件或目录,而导致文件无法被创建。 由于目录表或磁盘已满,而导致文件无法被创建。 FR_NOT_READY 由于驱动器中没有存储介质或任何其他原因,而导致磁盘驱动器无法工作。 FR_WRITE_PROTECTED 在存储介质被写保护的情况下,以写模式打开或创建文件对象。 FR_DISK_ERR 由于底层磁盘 I/O 接口函数中的一个错误,而导致该函数失败。 FR_INT_ERR 由于一个错误的 FAT 结构或一个内部错误,而导致该函数失败。 FR_NOT_ENABLED 逻辑驱动器没有工作区。 FR_NO_FILESYSTEM 磁盘上没有有效地 FAT 卷。 描述 如果函数成功,则创建一个文件对象。该文件对象被后续的读/写函数用来访 问文件。如果想要关闭一个打开的文件对象,则使用 f_close 函数。如果不关闭 修改后的文件,那么文件可能会崩溃。 在使用任何文件函数之前,必须使用 f_mount 函数为驱动器注册一个工作区。 只有这样,其他文件函数才能正常工作。 例子(文件拷贝) void main (void) {
/* 返回已写入字节数变量的指针 */
); 参数
FileObject 指向将被写入的已打开的文件对象结构的指针。
Buffer 指向存储写入数据的缓冲区的指针。
ByteToRead 要写入的字节数,UINT 范围内。
ByteRead 指向返回已写入字节数的 UINT 变量的指针。在调用该函数后,无论结果如何, 数值都是有效的。
/* 文件对象结构指针 */
); 参数
res = f_lseek(file, PRE_SIZE);
/* 预分配簇 */
if (res || file->fptr != PRE_SIZE) ... /* 检查文件大小是否已被正确扩展 */
res = f_lseek(file, DATA_START);
/* 没有簇分配延迟地记录数据流 */
FR_NOT_READY 由于驱动器中没有存储介质或任何其他原因,而导致磁盘驱动器无法工作。
FR_INVALID_OBJECT 文件对象无效。
描述
f_close 函数关闭一个打开的文件对象。无论向文件写入任何数据,文件的缓存 信息都将被写回到磁盘。该函数成功后,文件对象不再有效,并且可以被丢弃。 如果文件对象是在只读模式下打开的,不需要使用该函数,也能被丢弃。
/* 为逻辑驱动器注册工作区 */
f_mount(0, &fs[0]);
f_mount(1, &fs[1]); /* 打开驱动器 1 上的源文件 */
res = f_open(&fsrc, "1:srcfile.dat", FA_OPEN_EXISTING | FA_READ);
if (res) die(res);
描述
文件对象中的读/写指针以已写入字节数增加。该函数成功后,应该检查 *ByteWritten 来检测磁盘是否已满。在写操作过程中,一旦 *ByteWritten < *ByteToWritten ,则意味着该卷已满。
五、文件的移动操作
f_lseek
移动一个打开的文件对象的文件读/写指针。也可以被用来扩展文件大小(簇预分 配)。
FATFS fs[2];
/* 逻辑驱动器的工作区(文件系统对象) */
FIL fsrc, fdst;
/* 文件对象 */
BYTE buffer[4096]; /* 文件拷贝缓冲区 */
FRESULT res;
/* FatFs 函数公共结果代码 */
UINT br, bw;
/* 文件读/写字节计数 */
... res = f_truncate(file); res = f_lseek(file, 0);
/* 截断未使用的区域 */ /* 移动到文件起始处 */
...
res = f_close(file);
六、文件的截断操作
f_truncate 截断文件大小
FRESULT f_truncate (
FIL * FileObject
/* 移动文件读/写指针到相对于文件起始处偏移为 5000 字节处 */ res = f_lseek(file, 5000); /* 移动文件读/写指针到文件结束处,以便添加数据 */ res = f_lseek(file, file->fsize); /* 向前 3000 字节 */ res = f_lseek(file, file->fptr + 3000); /* 向后(倒带)2000 字节(注意溢出) */ res = f_lseek(file, file->fptr - 2000); /* 簇预分配(为了防止在流写时缓冲区上溢 */ res = f_open(file, recfile, FA_CREATE_NEW | FA_WRITE); /* 创建一个文件 */
与 FA_READ 结合可以进行读写访问。 FA_OPEN_EXISTING 打开文件。如果文件不存在,则打开失败。(默认) FA_OPEN_ALWAYS 如果文件存在,则打开;否则,创建一个新文件。 FA_CREATE_NEW 创建一个新文件。如果文件已存在,则创建失败。 FA_CREATE_ALWAYS 创建一个新文件。如果文件已存在,则它将被截断
/* 在驱动器 0 上创建目标文件 */
res = f_open(&fdst, "0:dstfile.dat", FA_CREATE_ALWAYS | FA_WRITE);
if (res) die(res);
/* 拷贝源文件到目标文件 */