当前位置:首页 > 通信技术 > 雷达通信电子战
[导读]关注、星标公众号,直达精彩内容ID:技术让梦想更伟大整理:李肖遥使用FreeRTOS,一个最基本的程序架构如下所示:int main(void){      必要的初始化工作;    创建任务1;    创建任务2;    ...   vTaskStartScheduler();...


关注、星标公众号,直达精彩内容

ID:技术让梦想更伟大

整理:李肖遥


使用FreeRTOS,一个最基本的程序架构如下所示:

int main(void)
{  
    必要的初始化工作;
    创建任务1;
    创建任务2;
    ...
   vTaskStartScheduler();  /*启动调度器*/
    while(1);   
}
任务创建完成后,静态变量指针pxCurrentTCB(见《FreeRTOS高级篇2---FreeRTOS任务创建分析》第7节内容)指向优先级最高的就绪任务。

但此时任务并不能运行,因为接下来还有关键的一步:启动FreeRTOS调度器。

调度器是FreeRTOS操作系统的核心,主要负责任务切换,即找出最高优先级的就绪任务,并使之获得CPU运行权。

调度器并非自动运行的,需要人为启动它。

API函数vTaskStartScheduler()用于启动调度器,它会创建一个空闲任务、初始化一些静态变量,最主要的,它会初始化系统节拍定时器并设置好相应的中断,然后启动第一个任务。

这篇文章用于「分析启动调度器的过程」,和上一篇文章一样,启动调度器也涉及到硬件特性(比如系统节拍定时器初始化等)。

本文仍然以Cortex-M3架构为例。

启动调度器的API函数vTaskStartScheduler()的源码精简后如下所示:

void vTaskStartScheduler( void )
{
BaseType_t xReturn;
StaticTask_t *pxIdleTaskTCBBuffer= NULL;
StackType_t *pxIdleTaskStackBuffer= NULL;
uint16_t usIdleTaskStackSize =tskIDLE_STACK_SIZE;

  /*如果使用静态内存分配任务堆栈和任务TCB,则需要为空闲任务预先定义好任务内存和任务TCB空间*/
  #if(configSUPPORT_STATIC_ALLOCATION == 1 )
  {
     vApplicationGetIdleTaskMemory( 
本站声明: 本文章由作者或相关机构授权发布,目的在于传递更多信息,并不代表本站赞同其观点,本站亦不保证或承诺内容真实性等。需要转载请联系该专栏作者,如若文章内容侵犯您的权益,请及时联系本站删除( 邮箱:macysun@21ic.com )。
换一批
延伸阅读
关闭