1. 平台介绍
本文档为基于uCOSII操作系统做开发的人员描述了一些uCOSII操作系统的基本特征。
1.1 结构图
图 1 整体结构图
2. 基本特征
2.1 uCOSII基本特征
uCOSII操作系统目前支持如下的基本特征:
1. 提供抢占式任务调度服务
2. 提供任务间同步与通信服务(如邮箱、消息队列、信号量、内存管理等)
3. 提供任务管理服务
4. 中断管理支持嵌套(中断嵌套层数最多255)
2.2 uCOSII存储配置
当前uCOSII的配置如下:
配置项 | 配置值 |
OS_MAX_EVENTS | 10 |
OS_MAX_FLAGS | 5 |
OS_MAX_MEM_PART | 5 |
OS_MAX_QS | 4 |
OS_MAX_TASKS | 20 |
OS_TASK_TMR_STK_SIZE | 128 |
OS_TASK_STAT_STK_SIZE | 128 |
OS_TASK_IDLE_STK_SIZE | 128 |
在上述配置情况下,在metaWare IDE优化选项为-O1的情况下,代码大小为19K左右,数据大小为8K左右。
2.3 uCOSII的tick配置
如无特殊要求,性能功能不受影响情况下,配置1 tick/ms,具体可根据实际应用的性能功能要求和HCLK及Timer0的时钟情况来调整bsp_os.c中全局变量unsigned int cyc = 0xXXXXX; 的值来改变Tick的频率。
3. 任务的建立
1. 任务栈的建立
每个任务都需要自己的栈空间,因此在建立任务之前,先给任务开辟一块RAM作为该任务的栈空间。示例如下:
OS_STK task1_stk[TASK_STK_SIZE];
2. 任务实体的编写
编写任务函数及实体,一个任务通常是一个无限的循环。示例如下:
static void task1(void * par)
{
#if OS_CRITICAL_METHOD == 3u
OS_CPU_SR cpu_sr = 0u;
#endif
unsigned int cnt = (unsigned int) par;
while(1) {
OSTimeDlyHMSM(0, 0, 0, 3000);
OSTaskResume(TASK2_PRI);
}
}
3. 将任务加入任务管理行列
使用OSTaskCreate接口函数来将任务加入任务管理行列,需要注意,此处要提供任务函数实体的入口地址,任务的栈空间的TOP地址及任务优先级。
初始任务的创建OSTaskCreate必须在OSInit接口函数之后和OSStart接口函数之前,其他任务的创建可在任务实体中调用OSTaskCreate接口函数来建立新任务。示例如下:
OSInit();
os_err = OSTaskCreate(task1, (void *)1, p_task1_stk, TASK1_PRI);
os_err = OSTaskCreate(task2, (void *)2, p_task2_stk, TASK2_PRI);
OSTaskSuspend(TASK2_PRI);
OSStart();
或者如下所示:
static void task1(void * par)
{
#if OS_CRITICAL_METHOD == 3u
OS_CPU_SR cpu_sr = 0u;
#endif
unsigned int cnt = (unsigned int) par;
os_err = OSTaskCreate(task3, (void *)1, p_task3_stk, TASK3_PRI);
os_err = OSTaskCreate(task2, (void *)2, p_task2_stk, TASK2_PRI);
while(1) {
OSTimeDlyHMSM(0, 0, 0, 3000);
OSTaskResume(TASK2_PRI);
}
}
4. 中断与异常处理函数的建立
4.1 中断与异常的处理过程
系统将所有的中断入口统一为函数cpu_int_entry的入口地址,将所有的异常入口统一为函数cpu_exc_entry的入口地址。用户无需修改os_cpu_a.s文件中cpu_int_entry和cpu_exc_entry的函数实体内容。在cpu_int_entry和cpu_exc_entry中,系统做完相关处理后,会根据当前中断或异常优先级来决定跳转到中断异常处理函数列表_kernel_exc_tbl的相应入口去执行中断或异常处理函数。而中断异常处理函数列表_kernel_exc_tbl中的具体的函数入口则需要用户建立。
4.2 用户的中断与异常处理函数的建立
1. 中断与异常处理函数实体的编写
如下所示:
static void OSTickISR( void )
{
/* clear timer interrupt */
write_aux_reg(ARC_REG_TIMER0_CTRL, TIMER_CTRL_IE | TIMER_CTRL_NH);
OSTimeTick();
}
2. 将函数入口地址加入中断异常处理函数列表_kernel_exc_tbl中
初始化设备后,将中断或异常处理函数的入口加入中断异常处理函数列表_kernel_exc_tbl中,如下所示:
arc_install_exc(INHNO_TIMER, (EXC_HANDLER)OSTickISR);
其中INHNO_TIMER为Timer在芯片内核中的中断异常号,OSTickISR则为Timer中断对应的中断处理函数入口地址。
然后使能中断即可。
5. 主要文件说明
uCOSII内核又可区分为两块:
1. 内核跟移植相关的部分,包括对中断和异常的处理、任务切换及临界段等
文件名 | 文件说明 |
os_cpu_a.s | uCOS内核中需要用户参与修改的部分,包括任务切换代码、中断处理代码、异常处理代码等(目前已移植完毕,用户不需要修改) |
os_cpu_c.c | uCOS内核中,提供给用户编写用户的钩子程序的文件 |
os_cpu.h | 与移植相关的函数声明 |
os_cfg_r.h | 与移植相关的操作系统资源配置 |
2.其他的uc/os-ii文件
uC/OS-II内核与体系结构无关的服务代码,不需要做任何修改的部分
文件名 | 文件说明 |
os_dbg.c | uCOS内核中,提供给用户用于配置调试的文件 |
os_core.c | uCOS内核的功能函数,用户不需要修改 |
os_flag.c | uCOS提供的时间标志组管理,用户不需要修改 |
os_mbox.c | uCOS提供的消息邮箱管理,用户不需要修改 |
os_mem.c | uCOS提供的内存管理,用户不需要修改 |
os_mutex.c | uCOS提供的互斥信号量管理,用户不需要修改 |
os_q.c | uCOS提供的队列管理,用户不需要修改 |
os_sem.c | uCOS提供的信号量管理,用户不需要修改 |
os_Task.c | uCOS提供的任务管理,用户不需要修改 |
os_time.c | uCOS提供的时间管理,用户不需要修改 |
os_tmr.c | uCOS提供的软Timer管理,用户不需要修改 |