![Rank: 8](images/default/star_level3.gif) ![Rank: 8](images/default/star_level3.gif)
- UID
- 872238
|
![](http://images.eccn.com/silabs/silicon_chip_980x60_202203.jpg)
OSCtxSw() 任务级的上下文切换,它是当任务因为被阻塞而主动请求cpu调度时被执行,由于此时的任务切换都是在非异常模式下进行的,它的工作是先将当前任务的cpu现场保存到该任务堆栈中,然后获得最高优先级任务的堆栈指针,从该堆栈中恢复此任务的cpu现场,使之继续执行。
OSIntCtxSw() 中断级的任务切换,它是在时钟中断ISR(中断服务例程)中发现有高优先级任务等待的时钟信号到来,则在中断退出后直接调度就绪的高优先级任务执行。
OSTickISR() 时钟中断处理函数,它的主要任务是负责处理时钟中断,调用系统实现的OSTimeTick函数,如果有等待时钟信号的高优先级任务,则需要在中断级别上调度其执行。其他相关的两个函数是OSIntEnter()和OSIntExit(),都需要在ISR中执行。
移植完以上程序后,用户就可以结合自己的项目要求来编写自己的应用程序了,用户可以添加如打印、空等待等任务,以下给出了一个例程,通过调用OSTaskCreate ( )函数注册了三个任务,由系统根据最优调度原理进行调度。
void main (void)
{
Initialize(); /* Processor specific initialization */
OSInit();
bufferSemaphore = OSSemCreate(BUFFER_LENGTH - 1);
terminalSemaphore = OSSemCreate(1);
OSTaskCreate(Task1, (void*)string1, (void*)&stacks[0][TASK_STK_SIZE - 1], 0);
OSTaskCreate(Task2, (void*)string2, (void*)&stacks[1][TASK_STK_SIZE - 1], 1);
OSTaskCreate(Task3, (void*)string3, (void*)&stacks[2][TASK_STK_SIZE - 1], 2);
OSStart(); /* Start..... */
}
四、驱动程序的添加
由于UC/OS提供的仅仅是一个任务调度的内核,通过以上移植,要想得到一个相对完整、实时的嵌入式多任务操作系统,还必须进行相当多的扩展工作。主要有:建立文件系统、通过开发如LCD液晶显示、USB通信、键盘、串口等驱动程序从而提供应用程序调用的API函数,还有创建图形用户接口(GUI)函数等,下面主要介绍一下串口驱动程序的开发。
void Uart_Init(int mclk,int baud) { }
该函数主要是初始化串口,设置波特率,其中mclk是系统主时钟频率,band参数传递串口通信波特率。
void Uart_Select(int ch) { }
该函数进行串口选择,ch 传递串口号。
char Uart_Getch(void) { }
该函数从串口读取字符,存放在一数组内。
void Uart_GetString(char *string) { }
该函数读取要发送的字符串,并一个一个字符地从串口发送。
void Uart_SendByte(int data) { }
该函数通过串口发送数据,data是需要发送的字符。
void Uart_SendString(char *pt) { }
该函数通过串口发送字符串,pt是字符串首地址的指针。
通过以上接口函数,系统向用户提供了屏蔽底层硬件的API函数,用户可以通过调用以上函数,方便地对串口进行操作。
五、结束语
目前市场上基于μc/os嵌入式操作系统的产品比较多,应用领域包括工业控制、信息家电、网络设备等方面,而且基于μc/os的应用正潮起云涌,蓬勃发展。随着后PC时代的来临,嵌入式系统理论与应用研究日新月异,μc/os正是我们手中开发嵌入式系统的利器,较好的掌握这门技术可以将理论与实际应用相结合,更好地服务于我们的日常生活和生产中。 |
|