UC_OS II 学习笔记
是一个可以基于ROM运行的、可裁减的、抢占式、实时、多任务OS内核;
可剥夺型的实时内核在任何时候都运行就绪了的最高优先级的任务。
一个任务,也称作一个线程,是一个简单的程序,该程序可以认为 CPU 完全只属该程序自己。
OS包含了任务调度,任务管理,时间管理,内存管理和任务间的通信和同步等基本功能。没有提供输入输出管理,文件系统,网络等额外的服务。但由于uC/OS-II良好的可扩展性和源码开放,这些非必须的功能完全可以由用户自己根据需要分别实现。
当任务执行完毕后(时间片到),他把自己的CPU寄存器所有内容保存到自己的堆栈中,同时把CPU让给别的任务,那么得到CPU使用权的任务把自己的CPU寄存器从自己的堆栈中放到真正的CPU寄存器中开始运行,就这样周而复始。
任务管理:建立任务时的优先级、堆栈
时间管理:通过定时中断来实现的
内存管理:给一个首地址、块大小、块数目。将连续地址数组链表化。
获取:指定一个内存控制块, 返回链表首部内存块地址,链表指针移到下一个空闲内存块;
释放:指定一个内存控制块以及要释放的内存块首地址。该内存块存放链表首个空闲内存块地址,并将自己赋值为首个空闲内存块。
邮箱:各个任务把自己的数据封装后以邮箱的形式发送给其它的任务使用,从而达到任务间通信的目的。一个指针型的变量,通常该指针指向一个包含了“消息”的特定数据结构。
1、µC/OS-II 是多任务,而且为每个任务开辟一个堆栈
2、µC/OS-II要用户在使用任何服务之前先调用 OSInit() [L1.5(2)]。它会建立两个任务:
空闲任务和统计任务,前者在没有其它任务处于就绪态时运行;后者计算 CPU 的利用率。
3、在 启动多任务OSStart() 之前用户至少要先建立一个任务
4、要使用堆栈检查操作必须用 OSTaskCreateExt()建立任务
5、OSMemCreate()函数建立并初始化一块内存区。内存区可以使用静态数组或在初始化时使用 malloc()函数建立。
msg = OSMemGet(CommMem, &err);
if (msg != (INT8U *)0) {
./* 内存块已经分配 */
}
6、
typedef struct { /* MEMORY CONTROL BLOCK */
void *OSMemAddr; /* Pointer to beginning of memory partition */
void *OSMemFreeList; /* Pointer to list of free memory blocks */
INT32U OSMemBlkSize; /* Size (in bytes) of each block of memory */
INT32U OSMemNBlks; /* Total number of blocks in this partition */
INT32U OSMemNFree; /* Number of memory blocks remaining in this partition */
} OS_MEM;
#define OS_EVENT_TYPE_UNUSED 0
#define OS_EVENT_TYPE_MBOX 1
#define OS_EVENT_TYPE_Q 2
#define OS_EVENT_TYPE_SEM 3
#define OS_EVENT_TYPE_MUTEX 4
#define OS_EVENT_TYPE_FLAG 5
typedef struct {
INT8U OSEventType; /* Type of event control block (see OS_EVENT_TYPE_???) */
INT8U OSEventGrp; /* Group corresponding to tasks waiting for event to occur */
INT16U OSEventCnt; /* Semaphore Count (not used if other EVENT type) */
void *OSEventPtr; /* Pointer to message or queue structure */
INT8U OSEventTbl[OS_EVENT_TBL_SIZE]; /* List of tasks waiting for event to occur */
} OS_EVENT;
7、调用 OSSchedLock()函数的任务独占 CPU,不管有没有其他高优先级的就绪任务。在这种情况下,中断仍然可以被接受和执行(中断必须允许)。OSSchedLock()函数和 OSSchedUnlock()函数必须配对使用。
任务调用了 OSSchedLock()函数后,决不能再调用可能导致当前任务挂起的系统函数:OSTimeDly(),OSTimeDlyHMSM(),OSSemPend(),OSMboxPend(),OSQPend()。因为任务调度已经被禁止,其他任务不能运行,这会导致系统死锁。
8、OSSemCreate()函数建立并初始化一个信号量。信号量的作用如下:
允许一个任务和其他任务或者中断同步。
取得设备的使用权
标志事件的发生
OS_EVENT *DispSem;
void main(void)
{
.
OSInit(); /* 初始化μC/OS-Ⅱ */
.
DispSem = OSSemCreate(1); /* 建立显示设备的信号量 */
.
OSStart(); /* 启动多任务内核 */
}
定义全局变量--初始化--post--pend--flush
CAN2_GLOBAL OS_EVENT *CAN2Receive;
CAN2Receive = OSQCreate(pCAN2RevBuf,USE_CAN2_RX_BUF_SIZE); //CAN2接收消息队列
stcRxBUF msg;
msg = RxBUF(j);
CAN2Rx_OSQPost(CAN2Receive,&msg);
mg=OSQPend(CAN2Receive,0,&err);
curRxBuf = *(stcRxBUF *) mg;
OSQFlush(CAN2Receive);
9、CPU使用率
void FirstAndOnlyTask (void *pdata)
{
.
OSStatInit(); /* 计算CPU使用率 */
.
OSTaskCreate(ノ ); /* 建立其他任务 */
OSTaskCreate(ノ );
.
for (;;) {
}
}
10、
INT8U OSTaskChangePrio (INT8U oldprio, INT8U newprio);
11、OSTaskCreate()建立一个新任务。任务的建立可以在多任务环境启动之前,也可以在正在运行的任务中建立。中断处理程序中不能建立任务。一个任务必须为无限循环结构,且不能有返回点。
12、无论用户程序中是否产生中断,在初始化任务堆栈时,堆栈的结构必须与 CPU 中断后寄存器入栈的顺序结构相同。
13、
在任务中必须调用μC/OS 提供的下述过程之一:延时等待、任务挂起、等待事件发生(等待信号量,消息邮箱、消息队列),以使其他任务得到 CPU。