µC/OS-Ⅱ多任务系统设计与启动解析

需积分: 9 0 下载量 111 浏览量 更新于2024-08-25 收藏 2.37MB PPT 举报
"这篇资源主要介绍了μC/OS-Ⅱ操作系统的核心概念,特别是其启动过程和数据结构,包括任务管理、任务控制块、链表、位图以及用户任务的编写方式。" μC/OS-Ⅱ是针对微控制器的实时操作系统,它提供了多任务环境,具有高效和可裁剪的特点。在μC/OS-Ⅱ的启动过程中,一旦调用了`OSStart()`函数,系统就会开始进行任务管理。这个函数是系统运行的起点,负责调度和执行预先定义好的任务。 在μC/OS-Ⅱ的数据结构中,有几个关键元素: 1. **任务控制块 (TCB)**: 用于管理每个任务。TCB包含任务的状态、优先级、栈指针等信息。在μC/OS-Ⅱ中,任务通过TCB链表进行组织,使得任务间的切换和管理更为高效。 2. **链表**: TCBs是通过链表链接在一起的,这种数据结构允许快速地添加、删除和查找任务,提高了查询任务的效率。此外,为了进一步优化,还使用了链表指针数组来快速定位特定任务。 3. **位图**: μC/OS-Ⅱ使用位图来记录资源的使用情况。每个二进制位对应一个资源状态,0表示资源未使用,1表示资源已被占用。这种方式节省内存,且查询速度快。 μC/OS-Ⅱ的任务由三部分构成:任务程序代码(函数)、任务堆栈和任务控制块。任务通常是一个无限循环,可以在循环中响应中断。为了确保关键代码段不被打断,可以使用`OS_ENTER_CRITICAL()`和`OS_EXIT_CRITICAL()`宏来进入和退出临界段,实现中断保护。 用户应用程序需要定义一系列任务,并在主函数中调用`OSInit()`初始化μC/OS-Ⅱ,然后创建这些任务。例如,用户可以定义如`MyTask1`、`MyTask2`、`MyTask3`等任务,每个任务都是一个无限循环,执行特定的业务逻辑。 μC/OS-Ⅱ的启动涉及到数据结构的初始化和任务的创建。通过理解这些基本概念,开发者可以有效地移植和定制μC/OS-Ⅱ,构建适合特定硬件平台和应用需求的嵌入式系统。

void I2C_3(unsigned char mcmd) { unsigned char length = 8; // Send Command while(length--) { if(mcmd & 0x80) { SDA3_1; } else { SDA3_0; } // uDelay(3); SCL3_1; // uDelay(3); SCL3_0; // uDelay(3); mcmd = mcmd << 1; } } void I2C_Ack3() { SDA3_1; // uDelay(3); SCL3_1; // uDelay(3); SCL3_0; // uDelay(3); } void I2C_NAck3() { SDA3_0; // uDelay(3); SCL3_1; // uDelay(3); SCL3_0; // uDelay(3); } void I2C_Start3() { SDA3_0; // uDelay(3); SCL3_1; // uDelay(3); SCL3_0; // uDelay(3); I2C_3(0x78); I2C_Ack3(); } void I2C_Stop3() { SCL3_1; // uDelay(5); SDA3_0; // uDelay(5); SDA3_1; // uDelay(5); } void Write_Command3(unsigned char Data) { I2C_Start3(); I2C_3(0x00); I2C_Ack3(); I2C_3(Data); I2C_Ack3(); I2C_Stop3(); } void Write_Data3(unsigned char Data) { I2C_Start3(); I2C_3(0x40); I2C_Ack3(); I2C_3(Data); I2C_Ack3(); I2C_Stop3(); } //-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-= //-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-= void pic13(void) { unsigned char i,j; unsigned int k; k=0; for(j=0;j<8;j++) { Write_Command3(0x22);//--set page1 Write_Command3(j);//--set start page Write_Command3(0x07);//--set end page for(i=0;i<128;i++) //ÏÔʾµ¥É«Êý¾Ýµ½LCD { Write_Data3(color13[k]); k=k+1; } } } void pic14(void) { Uchar i,j; Uint k; k=0; for(j=0;j<8;j++) { Write_Command3(0x22);//--set page1 Write_Command3(j);//--set start page Write_Command3(0x07);//--set end page for(i=0;i<128;i++) //ÏÔʾµ¥É«Êý¾Ýµ½LCD { Write_Data3(color14[k]); k=k+1; } } } void LCD_Init3(void) { GPIO_InitTypeDef GPIO_InitStructure; RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB ,ENABLE); GPIO_InitStructure.GPIO_Pin = GPIO_Pin_8|GPIO_Pin_9; GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; GPIO_Init(GPIOB, &GPIO_InitStructure); delay_ms(500);这些代码分别是什么意思

2023-05-25 上传