UCOSIII操作系统——系统初始化篇(2)CPU,SysTick,内存初始化

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 );
}
发布了10 篇原创文章 · 获赞 1 · 访问量 123

猜你喜欢

转载自blog.csdn.net/iiinoname/article/details/105183447