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。

猜你喜欢

转载自blog.csdn.net/LIU944602965/article/details/112526294