1.新建本地文件夹
文件夹 | 文件夹的作用 | ||
---|---|---|---|
Doc | 主要用来存放工程的说明文件(通常为readme.txt)。通常要在里面对整个工程的实现的功能,以及如何使用等进行简要的说明。 | ||
Project | 用来存放工程文件 | ||
User | μCOS-III | Source | 用来存放μC/COS-III源码,即操作系统的源码。 |
Ports | 用来存放接口文件(μC/COS-III与CPU连接的文件,即移植文件或系统文件)。 | ||
μCOS-CPU | 用来存放μC/COS-III相关的驱动程序。 | ||
μCOS-LIB | 用来存放用户程序(比如main.c文件) |
2.裸机与多任务系统
2.1裸机系统
这种系统是先初始化好相关的硬件驱动,在进入主函数的一个死循环(如while(1){}或for( ; ; ; ){}),按顺序的执行各种事情,这个通常只适用于只需按顺序执行的事件。必要的时候可以加入中断,外部信号来了跳进中断处理,事件的处理还是按顺序执行。
2.2多任务系统
相比于裸机系统,多任务系统虽然事件响应也是通过中断来完成,但是事件处理是通过任务完成的。而在多任务系统中,任务是由系统的调度器来调度的。在RTOS操作系统中,任务和裸机中的中断一样有优先级别,优先级高者被优先执行。如果一个事件就绪了,且优先级别足够高,就可能会马上得到CPU使用权(即立马响应)。
2.2.1任务的定义及实现
1.任务及任务函数是什么
在裸机系统中,main()函数中的无限循环部分。在多任务系统中,根据不同的功能,把整个系统分割成多个独立的且带无限循环的函数,这些函数称为任务,通常称之为线程。任务/线程实际是一个函数,函数内主体无限循环并且无退出和返回值。
2.任务栈
在裸机系统中,全局变量,子函数调用时局部变量,中断发生时函数的返回地址都保存在栈区,而栈是单片机RAM中一段连续的存储空间,栈的大小由启动代码(在启动文件中汇编代码)来分配。
而在多任务系统中,每个任务(线程)都是独立的,互不干扰,在创建时要给每个任务都分配独立的栈空间,栈空间通常是预先定义好的全局数组。这些任务栈也是存储在RAM中。
3.实现任务创建
定义好了任务后我们需要创建任务(线程)才能进行工作。创建一个任务需要任务栈(CPU_STK),任务函数,任务块(OS_TCB)最终联系起来才能由系统进行统一的调度。完成联系需要调用任务创建函数来创建任务。
/*声明任务控制块(OS_TCB)。*/
static OS_TCB AppTaskStartTCB;
/*声明任务堆栈(CPU_STK)。*/
static CPU_STK AppTackStartStk[TASK_STK_SIZE];
函数如下:
void OSTaskCreate (OS_TCB *p_tcb, //任务控制块
CPU_CHAR *p_name, //任务名字
OS_TASK_PTR p_task, //任务函数
void *p_arg, //传递给任务函数的参数
OS_PRIO prio, //任务优先级
CPU_STK *p_stk_base,//任务堆栈基地址
CPU_STK_SIZE stk_limit, //任务堆栈深度限位
CPU_STK_SIZE stk_size, //任务堆栈的大小
OS_MSG_QTY q_size, //任务内部消息队列能够接收的最大信息数目,为0时禁止接收消息
OS_TICK time_quanta,//使能时间片轮转时的时间
void *p_ext, //用户补充存储区
OS_OPT opt, //
OS_ERR *p_err); //输出错误参数
任务创建好之后,还需要把任务添加到就绪列表的数组里面,表示任务已经就绪,系统随时可以调度。但是这里让系统内核完成,只需调用下函数启动系统
/* 启动多任务系统,控制权交给uC/OS-III */
OSStart(&err);