UCOSIII其他内容导航不迷路
UCOSIII操作系统-简介
UCOSIII操作系统——任务篇(1)创建任务
UCOSIII操作系统——任务篇(2)相关API函数
UCOSIII操作系统——系统初始化篇(1)系统初始化
UCOSIII操作系统——系统初始化篇(2)CPU,SysTick,内存初始化
UCOSIII操作系统——硬件初始化篇(1)硬件初始化以及开始运行系统
正在更新整理…
说在前面:
这个内容不适合0基础的人,因为这里只讲了应用层面的东西,并没有深入内核讲解,所以要从零开始学UCOSIII的朋友,可以先去学完入门内容,再来观看这个笔记加深印象。
这篇文章是个人学习整理,如有错误请指正
UCOSIII操作系统——系统初始化篇(2)CPU,SysTick,内存初始化
CPU初始化
- 函数原型
CPU_Init(); //初始化 CPU 组件(时间戳、关中断时间测量和主机名)
- 时间戳初始化
- 最大关中断时间测量初始化
- CPU 名字初始化
一般在开始任务里面,硬件初始化之后再CPU初始化
SysTick初始化
时钟节拍的频率表示操作系统每1秒钟产生多少个tick,tick即是操作系统节拍的时钟周期,时钟节拍就是系统以固定的频率产生中断(时基中断),并在中断中处理与时间相关的事件,推动所有任务向前运行。
时钟节拍需要依赖于硬件定时器,在STM32裸机程序中经常使用的SysTick 时钟是MCU的内核定时器,通常都使用该定时器产生操作系统的时钟节拍。
用户需要先在“os_ cfg_ app.h” 中设定时钟节拍的频率,该频率越高,操作系统检测事件就越频繁,可以增强任务的实时性,但太频繁也会增加操作系统内核的负担加重,所以用户需要权衡该频率的设置。
函数OS_ CPU_ SysTickInit(用 于初始化时钟节拍中断,初始化中断的优先级,SysTick中断的使能等等,这个函数要跟不同的CPU进行编写,并且在系统任务的第一个任务开始的时候进行调用,如果在此之前进行调用,可能会造成系统奔溃,因为系统还没有初始化好就进入中断,可能在进入和退出中断的时候会调用系统未初始化好的一-些模块。
- 关于滴答定时器这一方面我自己也是没能很清晰的理解,就知道是系统的心跳,为OS提供时基,阻塞延时的函数也是以SysTick的时基为基准计时的,具体配置要根据不同的内核查资料配置吧。
内存初始化
我们都知道,内存在嵌入式中是很珍贵的存在,而一个系统它是软件,则必须要有一块内存属于系统所管理的,所以在系统创建任务之前,就必须将系统必要的东西进行初始化,uCOS采用一块连续的大数组作为系统管理的内存,CPU_ NT08U Mem_Heap[LIB__MEM_CFG_HEAP_SIZE],在使用之前就需要先将管理的内存进行初始化。
- 函数原型
Mem_Init(); //初始化内存管理组件(堆内存池和内存池表)
在CPU初始化,和SysTick初始化之后再初始化内存。
就这么写吧,能保证系统正常工作就行了,现在的资料也没有很好的解释这些东西…
初始化实例
int main (void)
{
OS_ERR err;
/* 初始化系统*/
OSInit(&err);
/* 创建任务 */
OSTaskCreate((OS_TCB *)&AppTaskStartTCB,
(CPU_CHAR *)"App Task Start",
(OS_TASK_PTR ) AppTaskStart,
(void *) 0,
(OS_PRIO ) APP_TASK_START_PRIO,
(CPU_STK *)&AppTaskStartStk[0],
(CPU_STK_SIZE) APP_TASK_START_STK_SIZE / 10,
(CPU_STK_SIZE) APP_TASK_START_STK_SIZE,
(OS_MSG_QTY ) 5u,
(OS_TICK ) 0u,
(void *) 0,
(OS_OPT )(OS_OPT_TASK_STK_CHK | OS_OPT_TASK_STK_CLR),
(OS_ERR *)&err);
/* 开启调度*/
OSStart(&err);
}
/***********************************************************************
* @ 函数名 : AppTaskStart
* @ 功能说明: 为了方便管理,所有的任务创建函数都放在这个函数里面
* @ 参数 : 无
* @ 返回值 : 无
**********************************************************************/
static void AppTaskStart (void *p_arg)
{
CPU_INT32U cpu_clk_freq;
CPU_INT32U cnts;
OS_ERR err;
(void)p_arg;
/* 开发板硬件初始化 */
BSP_Init();
/* CPU始化*/
CPU_Init();
/* SysTick初始化*/
cpu_clk_freq = BSP_CPU_ClkFreq();
cnts = cpu_clk_freq / (CPU_INT32U)OSCfg_TickRate_Hz;
OS_CPU_SysTickInit(cnts);
/* 内存初始化*/
Mem_Init();
#if OS_CFG_STAT_TASK_EN > 0u
OSStatTaskCPUUsageInit(&err);
#endif
CPU_IntDisMeasMaxCurReset();
OSTaskCreate((OS_TCB *)&AppTaskStartTCB1,
(CPU_CHAR *)"App Task Start1",
(OS_TASK_PTR ) AppTaskStart1,
(void *) 0,
(OS_PRIO ) APP_TASK_START_PRIO1,
(CPU_STK *)&AppTaskStartStk1[0],
(CPU_STK_SIZE) APP_TASK_START_STK_SIZE / 10,
(CPU_STK_SIZE) APP_TASK_START_STK_SIZE,
(OS_MSG_QTY ) 5u,
(OS_TICK ) 0u,
(void *) 0,
(OS_OPT )(OS_OPT_TASK_STK_CHK | OS_OPT_TASK_STK_CLR),
(OS_ERR *)&err);
OSTaskDel ( & AppTaskStartTCB, & err );
}