支持240个外设中断,系统异常优先级12个
2.86版本支持0~255共256个任务,分别对应优先级0~256,其中0 为最高优先级。255为最低级,系统保留了4个最高优先级的任务和4个最低优先级的任务,
所有用户可以使用的任务数有248个。
256个可编程优先级
MPU --- 内存保护memory protect uint
SVC --- supervison call,用来创造对特权操作代码的调用。ucos2没有特权级和用户级,此物可不管。
NVIC--- nested vectored interruput controler,嵌套向量中断管理
-与内核私交甚密
-动态改变优先级
-自动保存和恢复
-支持嵌套
-中断计时
typedef struct
{
void *OSEventPtr; //当事件是邮箱时,指向一个消息;当事件是消息队列时,指向一个数据结构
INT8U OSEventTbl[OS_EVENT_TBL_SIZE]; //处于就绪状态的任务列表
INT16U OSEventCnt; //当事件是信号量时的计数器
INT8U OSEventType; //事件类型OS_EVENT_SEM,OS_EVENT_TYPE_MBOX,OS_EVENT_TYPE_Q
INT8U OSEventGrp; //等待任务所在的组
}OS_EVENT;
OSUnMapTbl[?.OSEventTbl[3]]是列表中那一行的bit位
OSInit();--所有事件控制块被链接成一个单向链表---有SEM/P/MBOX的时候就取出一个空闲事件控制块,
并对其初始化,取出之后,不可删除也不可以再放回空闲链表list of free ECBs
OSEventWaitListInit(); 当建立一个信号量、消息队列或者邮箱的时候,相应的建立函数OSSemInit(),OSmBoxCreat()或OSQCreat(),
通过调用OSEventWaitListInit();来初始化一个空的任务列表,该函数只有一个参数,就是要指向需要初始化的
事件控制块的指针pevent. 使之位0。
pevent->OSEventGrp=0x00; for(i=0;i<OS_EVENT_TBL_SIZE;i++) { pevent->[OSEventTbl[i]]=0x00; }
OSEventTaskRdy();当HPT处于就绪状态时,事件对应的OSSemPost()、OSMboxPost()、OSQPost()或OSQPostFront()调用该函数操作。
OSEventTaskWait();当一个任务要等待一个事件的发生时,相应事件的OSSemPend(),OSmBoxPend()或OSQPend()
就会调用该函数将当前任务从就绪列表中删除,并放到相应事件的事件任务块中的等待列表中。
OSEventTO();在预先指定的时间内任务等待的事件没有发生,OSTimeTick()就会因为等待超时而将任务的状态置为超时,这种情况下,
OSSemPend(),OSmBoxPend()或OSQPend()调用该函数负责从任务控制块中的事件等待列表中将任务删除(清0指针就可以办到),并置之为就绪状态
信号量:
用于对共享资源的访问---钥匙key;用于表示某事件的发生---旗帜flag。
在OS_CFG.H中将OS_SEM_EN的开关量置1来打开该功能。由1--16位(0~65535)的计数值和2--等待该信号量的任务所组成的等待任务表。
OSSemCreat();//返回给调用函数一个指向任务控制块的指针pevent,没有任务控制块就返回一个NULL指针
OSSemPend();//该函数允许用户定义一个最长等待时间作为它的参数,以防止任务无休止的等待下去
OSSemAccept(); //无等待的请求一个信号量,中断服务子程序要请求一个信号量时,只能用OSSemAccept(),而不能用OSSemPend(),
因为中断服务子程序是不允许等待的。
只用于任务的调用OSSemPost();传递一个信号量,如果没有任务在等待该信号量,简单的使该信号量+1
只用于任务的调用OSSemQuery();查询一个信号量的当前状态,先检查pevent是否由OSSemCreat()产生,然后再将等待任务列表和计数值从
OS_EVENT拷贝到OS_SEM_DATA中的结构体变量中去。
邮箱:
是ucos2的另外一种通信机制,可以使一个任务或一个中断服务子程序向另外一个任务发送一个指针型的变量,该变量包含了特定消息的数据结构,
要使用邮箱,需在OS_CFG.H中将OS-MBOX_EN置1.
OSMboxCreat();OSMboxPend();OSMboxPost();OSMboxAccept();OSMboxQuery();
消息队列:
OSQCreat();OSQPend();OSQPost();OSQAccept();OSQQuery();OSQPost();OSQPostFlush();
消息队列的符号看起来像很多个邮箱,我们可以把他当做多个邮箱组成的数组,只是他们共有一个等待任务列表。
用户必须在多任务系统启动之后开启时钟节拍,OSStart()
1.stm32f10x.h选择芯片类型78---92行 ld md hd xd cl ~~~~~~ld_vl md_vl hd_vl
2.stm32f10x.h选择标准外设库第105行 #define USE_STDPERIPH_DRIVER
3.stm32f10x.h选择芯片频率110--115行
4.stm32f10x_conf.h 对于工程中不需要的外设注释掉
5.注释掉stm32f10x_it.h和stm32f10x_it.c中的 void PendSV_Handler(void);
以免和ucos2中的OS_CPU.H中的void OS_CPU_PendSVHandler(void);冲突
操作系统的概念:
1.任务调度:为了保证某个任务的实时性,给每个任务分配一个不同的优先级,当发生任务切换时,总是执行就绪的最高优先级的任务,
有2中情况会发生任务切换:(1)任务等待资源就绪或自我延时,任务已经完成暂时没事做,可理解为任务主动放弃CPU的使用权。
(2)退出中断,中断后某资源可能就绪,需要任务切换。 使用SysTick周期性的中断进行任务切换,调用OSTimeTick();
2.任务间的通信和同步:总体来讲,无非是任务A因为某个资源未就绪,或某个事件未发生,就放弃CPU的使用权,等待任务B或者中断使该任务就绪,
当再次发生任务切换时,如果任务A的优先级最高,仍然执行A。
3.内存管理
4.时间管理
每一个任务都处在以下5种状态:
挂起态(等待态)、等待某一事件的发生、等待I/O脉冲、等待共享资源由暂不能使用变为可用、或等待超时信号以结束等待
休眠态、相当于任务驻留在内存中,但没有被多任务内核调度使用
就绪态、已经准备好了,但由于优先级比正在运行的低,暂时还不能运行
运行态、该任务掌握了CPU的控制权
被中断态
R0用于传递任务函数的参数,因此等于p_arg.
任务切换时发生在PendSVHandler()里面的,在这个里面调用OSCtrSW();
GPIO--共17个
void GPIO_DeInit(GPIO_TypeDef* GPIOx);//复位外设寄存器
void GPIO_AFIODeInit(void);//服用 功能函数
void GPIO_Init(GPIO_TypeDef* GPIOx, GPIO_InitTypeDef* GPIO_InitStruct);//配置模式和高低字节
void GPIO_StructInit(GPIO_InitTypeDef* GPIO_InitStruct);//默认的端口模式和时钟晶振
u8 GPIO_ReadInputDataBit(GPIO_TypeDef* GPIOx, u16 GPIO_Pin);//读取bit输入值
u16 GPIO_ReadInputData(GPIO_TypeDef* GPIOx);//读整个端口的输入值
u8 GPIO_ReadOutputDataBit(GPIO_TypeDef* GPIOx, u16 GPIO_Pin);//读输出位
u16 GPIO_ReadOutputData(GPIO_TypeDef* GPIOx);//读输出端口
void GPIO_SetBits(GPIO_TypeDef* GPIOx, u16 GPIO_Pin);//置1
void GPIO_ResetBits(GPIO_TypeDef* GPIOx, u16 GPIO_Pin);//置0
void GPIO_WriteBit(GPIO_TypeDef* GPIOx, u16 GPIO_Pin, BitAction BitVal);//
void GPIO_Write(GPIO_TypeDef* GPIOx, u16 PortVal);
void GPIO_PinLockConfig(GPIO_TypeDef* GPIOx, u16 GPIO_Pin);//锁住后端口值不再变化
void GPIO_EventOutputConfig(u8 GPIO_PortSource, u8 GPIO_PinSource);//事件输出引脚
void GPIO_EventOutputCmd(FunctionalState NewState);//使能、失能
void GPIO_PinRemapConfig(u32 GPIO_Remap, FunctionalState NewState);//复用功能映射
void GPIO_EXTILineConfig(u8 GPIO_PortSource, u8 GPIO_PinSource);//选定某个IO作为外部中断引脚
2.86版本支持0~255共256个任务,分别对应优先级0~256,其中0 为最高优先级。255为最低级,系统保留了4个最高优先级的任务和4个最低优先级的任务,
所有用户可以使用的任务数有248个。
256个可编程优先级
MPU --- 内存保护memory protect uint
SVC --- supervison call,用来创造对特权操作代码的调用。ucos2没有特权级和用户级,此物可不管。
NVIC--- nested vectored interruput controler,嵌套向量中断管理
-与内核私交甚密
-动态改变优先级
-自动保存和恢复
-支持嵌套
-中断计时
typedef struct
{
void *OSEventPtr; //当事件是邮箱时,指向一个消息;当事件是消息队列时,指向一个数据结构
INT8U OSEventTbl[OS_EVENT_TBL_SIZE]; //处于就绪状态的任务列表
INT16U OSEventCnt; //当事件是信号量时的计数器
INT8U OSEventType; //事件类型OS_EVENT_SEM,OS_EVENT_TYPE_MBOX,OS_EVENT_TYPE_Q
INT8U OSEventGrp; //等待任务所在的组
}OS_EVENT;
OSUnMapTbl[?.OSEventTbl[3]]是列表中那一行的bit位
OSInit();--所有事件控制块被链接成一个单向链表---有SEM/P/MBOX的时候就取出一个空闲事件控制块,
并对其初始化,取出之后,不可删除也不可以再放回空闲链表list of free ECBs
OSEventWaitListInit(); 当建立一个信号量、消息队列或者邮箱的时候,相应的建立函数OSSemInit(),OSmBoxCreat()或OSQCreat(),
通过调用OSEventWaitListInit();来初始化一个空的任务列表,该函数只有一个参数,就是要指向需要初始化的
事件控制块的指针pevent. 使之位0。
pevent->OSEventGrp=0x00; for(i=0;i<OS_EVENT_TBL_SIZE;i++) { pevent->[OSEventTbl[i]]=0x00; }
OSEventTaskRdy();当HPT处于就绪状态时,事件对应的OSSemPost()、OSMboxPost()、OSQPost()或OSQPostFront()调用该函数操作。
OSEventTaskWait();当一个任务要等待一个事件的发生时,相应事件的OSSemPend(),OSmBoxPend()或OSQPend()
就会调用该函数将当前任务从就绪列表中删除,并放到相应事件的事件任务块中的等待列表中。
OSEventTO();在预先指定的时间内任务等待的事件没有发生,OSTimeTick()就会因为等待超时而将任务的状态置为超时,这种情况下,
OSSemPend(),OSmBoxPend()或OSQPend()调用该函数负责从任务控制块中的事件等待列表中将任务删除(清0指针就可以办到),并置之为就绪状态
信号量:
用于对共享资源的访问---钥匙key;用于表示某事件的发生---旗帜flag。
在OS_CFG.H中将OS_SEM_EN的开关量置1来打开该功能。由1--16位(0~65535)的计数值和2--等待该信号量的任务所组成的等待任务表。
OSSemCreat();//返回给调用函数一个指向任务控制块的指针pevent,没有任务控制块就返回一个NULL指针
OSSemPend();//该函数允许用户定义一个最长等待时间作为它的参数,以防止任务无休止的等待下去
OSSemAccept(); //无等待的请求一个信号量,中断服务子程序要请求一个信号量时,只能用OSSemAccept(),而不能用OSSemPend(),
因为中断服务子程序是不允许等待的。
只用于任务的调用OSSemPost();传递一个信号量,如果没有任务在等待该信号量,简单的使该信号量+1
只用于任务的调用OSSemQuery();查询一个信号量的当前状态,先检查pevent是否由OSSemCreat()产生,然后再将等待任务列表和计数值从
OS_EVENT拷贝到OS_SEM_DATA中的结构体变量中去。
邮箱:
是ucos2的另外一种通信机制,可以使一个任务或一个中断服务子程序向另外一个任务发送一个指针型的变量,该变量包含了特定消息的数据结构,
要使用邮箱,需在OS_CFG.H中将OS-MBOX_EN置1.
OSMboxCreat();OSMboxPend();OSMboxPost();OSMboxAccept();OSMboxQuery();
消息队列:
OSQCreat();OSQPend();OSQPost();OSQAccept();OSQQuery();OSQPost();OSQPostFlush();
消息队列的符号看起来像很多个邮箱,我们可以把他当做多个邮箱组成的数组,只是他们共有一个等待任务列表。
用户必须在多任务系统启动之后开启时钟节拍,OSStart()
1.stm32f10x.h选择芯片类型78---92行 ld md hd xd cl ~~~~~~ld_vl md_vl hd_vl
2.stm32f10x.h选择标准外设库第105行 #define USE_STDPERIPH_DRIVER
3.stm32f10x.h选择芯片频率110--115行
4.stm32f10x_conf.h 对于工程中不需要的外设注释掉
5.注释掉stm32f10x_it.h和stm32f10x_it.c中的 void PendSV_Handler(void);
以免和ucos2中的OS_CPU.H中的void OS_CPU_PendSVHandler(void);冲突
操作系统的概念:
1.任务调度:为了保证某个任务的实时性,给每个任务分配一个不同的优先级,当发生任务切换时,总是执行就绪的最高优先级的任务,
有2中情况会发生任务切换:(1)任务等待资源就绪或自我延时,任务已经完成暂时没事做,可理解为任务主动放弃CPU的使用权。
(2)退出中断,中断后某资源可能就绪,需要任务切换。 使用SysTick周期性的中断进行任务切换,调用OSTimeTick();
2.任务间的通信和同步:总体来讲,无非是任务A因为某个资源未就绪,或某个事件未发生,就放弃CPU的使用权,等待任务B或者中断使该任务就绪,
当再次发生任务切换时,如果任务A的优先级最高,仍然执行A。
3.内存管理
4.时间管理
每一个任务都处在以下5种状态:
挂起态(等待态)、等待某一事件的发生、等待I/O脉冲、等待共享资源由暂不能使用变为可用、或等待超时信号以结束等待
休眠态、相当于任务驻留在内存中,但没有被多任务内核调度使用
就绪态、已经准备好了,但由于优先级比正在运行的低,暂时还不能运行
运行态、该任务掌握了CPU的控制权
被中断态
R0用于传递任务函数的参数,因此等于p_arg.
任务切换时发生在PendSVHandler()里面的,在这个里面调用OSCtrSW();
GPIO--共17个
void GPIO_DeInit(GPIO_TypeDef* GPIOx);//复位外设寄存器
void GPIO_AFIODeInit(void);//服用 功能函数
void GPIO_Init(GPIO_TypeDef* GPIOx, GPIO_InitTypeDef* GPIO_InitStruct);//配置模式和高低字节
void GPIO_StructInit(GPIO_InitTypeDef* GPIO_InitStruct);//默认的端口模式和时钟晶振
u8 GPIO_ReadInputDataBit(GPIO_TypeDef* GPIOx, u16 GPIO_Pin);//读取bit输入值
u16 GPIO_ReadInputData(GPIO_TypeDef* GPIOx);//读整个端口的输入值
u8 GPIO_ReadOutputDataBit(GPIO_TypeDef* GPIOx, u16 GPIO_Pin);//读输出位
u16 GPIO_ReadOutputData(GPIO_TypeDef* GPIOx);//读输出端口
void GPIO_SetBits(GPIO_TypeDef* GPIOx, u16 GPIO_Pin);//置1
void GPIO_ResetBits(GPIO_TypeDef* GPIOx, u16 GPIO_Pin);//置0
void GPIO_WriteBit(GPIO_TypeDef* GPIOx, u16 GPIO_Pin, BitAction BitVal);//
void GPIO_Write(GPIO_TypeDef* GPIOx, u16 PortVal);
void GPIO_PinLockConfig(GPIO_TypeDef* GPIOx, u16 GPIO_Pin);//锁住后端口值不再变化
void GPIO_EventOutputConfig(u8 GPIO_PortSource, u8 GPIO_PinSource);//事件输出引脚
void GPIO_EventOutputCmd(FunctionalState NewState);//使能、失能
void GPIO_PinRemapConfig(u32 GPIO_Remap, FunctionalState NewState);//复用功能映射
void GPIO_EXTILineConfig(u8 GPIO_PortSource, u8 GPIO_PinSource);//选定某个IO作为外部中断引脚