一、移植文件
源码文件包
移植芯片STM32F103使用的是3.03源码包。
应用文件移植,暂时只移植选中文件。
uc-CPU内文件。
uc-LIB内文件。
uCOS-III内文件包括Ports和Source。
Source内文件。
二、系统启动过程
1、系统初始化
在创建任务之前需要进行系统初始化 OSInit();
2、CPU初始化
CUP_Init();
3、SysTick初始化
OS_CPU_SysTickInit(); // 需要在第一个任务开始的时候调用。
4、内存初始化
uCOS采用一块连续的大数组作为系统管理的内存,CPU_INT08U Mem_Heap[LIB_MEM_CFG_HEAP_SIZE],在使用之前就需要先将管理的内存进行初始化。
Mem_Init();
5、启动任务调度器
OSStart();
三、函数讲解
任务管理
需要在配置文件中使能对应接口功能,移植过程中默认打开。
1、任务挂起
OS_TaskSuspend(&tcb, &err);
2、任务恢复
OSTaskResume(&tcb, &err);
3、任务删除
OSTaskDel(&tcb, &err);
消息队列
声明句柄:
OS_Q queue;
1、创建消息队列函数
void OSQCreate(OS_Q *p_q, //消息队列指针
CPU_CHAR *p_name, //消息队列名称
OS_MSG_QTY max_qty, //消息队列大小(不能为0)
OS_ERR *p_err) //返回错误类型
2、消息队列删除函数
OS_OBJ_QTY OSQDel (OS_Q *p_q, //消息队列指针
OS_OPT opt, //选项
OS_ERR *p_err) //返回错误类型
3、消息队列发送函数
void OSQPost (OS_Q *p_q, //消息队列指针
void *p_void, //消息指针
OS_MSG_SIZE msg_size, //消息大小(单位:字节)
OS_OPT opt, //选项
OS_ERR *p_err) //返回错误类型
4、消息队列获取函数
void *OSQPend (OS_Q *p_q, //消息队列指针
OS_TICK timeout, //等待期限(单位:时钟节拍)
OS_OPT opt, //选项
OS_MSG_SIZE *p_msg_size, //返回消息大小(单位:字节)
CPU_TS *p_ts, //获取等到消息时的时间戳
OS_ERR *p_err) //返回错误类型
信号量
声明信号量句柄:
OS_SEM semaphore;
1、创建信号
OSSemCreate();
2、删除信号
OSSemDel();
3、释放信号
OSSemPost();
4、获取信号
OSSemPend();
互斥量
声明句柄:
OS_MUTEX mutex;
1、创建互斥量
OSMutexCreate();
2、删除互斥量
OSMutexDel();
3、开锁
OSMutexPost();
4、闭锁
OSMutexPend();
事件标志组
声明句柄:
OS_FLAG_GRP flag_grp;
1、创建事件标志
OSFlagCreate();
2、删除事件标志
OSFlagDel();
3、事件标志设置
OSFlagPost();
4、事件标志等待
OSFlagPend();
软件定时器
声明句柄:
OS_TMR tmr;
1、创建定时器
OSTmrCreate();
2、删除定时器
OSTmrDel();
3、启动定时器
OSTmrStart();
4、停止定时器
OSTmrStop();
任务信号量
不需要句柄;
1、释放任务信号
OSTaskSemPost();
2、获取任务信号
OSTaskSemPend();
任务消息队列
不需要创建句柄;
1、发送任务消息
void OSTaskQPost (OS_TCB *p_tcb, //目标任务
void *p_void, //消息内容地址
OS_MSG_SIZE msg_size, //消息长度
OS_OPT opt, //选项
OS_ERR *p_err) //返回错误类型
2、接收任务消息
注意:消息长度必须用变量接收。
void *OSTaskQPend (OS_TICK timeout, //等待期限(单位:时钟节拍)
OS_OPT opt, //选项
OS_MSG_SIZE *p_msg_size, //返回消息长度
CPU_TS *p_ts, //返回时间戳
OS_ERR *p_err) //返回错误类型
内存管理
对于可靠性要求高的系统需要用静态内存。
声明内存句柄:
OS_MEM mem;
OSMemCreate()只能在任务中使用,OSMemGet()和OSMemPut()可以在中断中使用。
1、内存池创建
void OSMemCreate (OS_MEM *p_mem, //内存池控制块
CPU_CHAR *p_name, //命名内存池
void *p_addr, //内存池首地址
OS_MEM_QTY n_blks, //内存块数目
OS_MEM_SIZE blk_size, //内存块大小(单位:字节)
OS_ERR *p_err) //返回错误类型
2、内存申请函数
void *OSMemGet (OS_MEM *p_mem, //内存管理对象
OS_ERR *p_err) //返回错误类型
3、内存释放函数
void OSMemPut (OS_MEM *p_mem, //内存管理对象
void *p_blk, //要退回的内存块
OS_ERR *p_err) //返回错误类型
中断管理
CPU利用率
1、开始之前先初始化
注意:要在创建任务之前初始化。
OSStatTaskCPUUsageInit();
2、统计任务
OS_StatTask()
3、堆栈检测
对于需要进行任务堆栈检测的任务,在其被OSTaskCreate()函数创建时,选项参数 opt 还需包含 OS_OPT_TASK_STK_CHK。
OSTaskStkChk();