嵌入式软件设计(freertos使用)

【 声明:版权所有,欢迎转载,请勿用于商业用途。 联系信箱:feixiaoxing @163.com】

        在读书的时候,ucos ii是学习的最多的rtos。但是在实际开发中,freertos使用最多。这当中估计还是商业的因素占了很大的比例,毕竟freertos本身是开源的操作系统,没有版权的问题,可以在商业产品中自由使用。

        在mcu上面使用freertos很常见,github上也有很多的范例可以学习。学习freertos不在于学习设计os本身,而在于使用它。当然,如果学有余力,学习一下rtos源代码也是可以的,至少对于提高自己的debug水平是很有帮助的。

1、下载关联的rtos代码

git clone https://github.com/Embedfire-freertos/ebf_freertos_peripheral_code_stm32f103_zhinanzhe.git

2、打开对应led项目

选择项目01-FreeRTOS-LED即可

3、打开工程

4、分析main函数

int main(void)
{	
  BaseType_t xReturn = pdPASS;


  BSP_Init();
	

  xReturn = xTaskCreate((TaskFunction_t )AppTaskCreate,  
                        (const char*    )"AppTaskCreate",
                        (uint16_t       )512,  
                        (void*          )NULL,
                        (UBaseType_t    )1, 
                        (TaskHandle_t*  )&AppTaskCreate_Handle);
          
  if(pdPASS == xReturn)
    vTaskStartScheduler();  
  else
    return -1;  
  
  while(1);     
}

        如代码所示,主要有三个部分组成。第一个部分是BSP_Init(),准备硬件环境;第二个部分是创建一个AppTaskCreate的线程;第三个是启动os,也就是调用vTaskStartScheduler函数。

5、BSP_Init初始化

static void BSP_Init(void)
{

	NVIC_PriorityGroupConfig( NVIC_PriorityGroup_4 );
	
	LED_GPIO_Config();

	USART_Config();
  
}

        BSP初始化的部分非常简单,主要就是初始化中断、LED初始化和串口初始化三部分。

6、第一个创建的os任务

static void AppTaskCreate(void)
{
  BaseType_t xReturn = pdPASS;
  
  taskENTER_CRITICAL();           
  
  xReturn = xTaskCreate((TaskFunction_t )LED_Task, 
                        (const char*    )"LED_Task",
                        (uint16_t       )512,  
                        (void*          )NULL,	
                        (UBaseType_t    )2,	   
                        (TaskHandle_t*  )&LED_Task_Handle);
  if(pdPASS == xReturn)
    printf("OK rn");
  
  vTaskDelete(AppTaskCreate_Handle); 
  
  taskEXIT_CRITICAL();    
}

        如上面代码所示,这是我们创建的第一个os任务。这个任务的主要工作其实就是创建一个LED_Task。注意,任务创建好之后,LED_Task没有立即执行,因为AppTaskCreate的优先级是1,LED_Task的优先级是2,所以AppTaskCreate继续执行。当然创建好这个任务,它就调用vTaskDelete把自己从调度队列中删除了,并且在调用taskEXIT_CRITICAL的时候触发中断,准备切换到LED_Task。

7、第二个创建os任务

static void LED_Task(void* parameter)
{	
    while (1)
    {
        LED1_ON;
        vTaskDelay(500);  
        printf("LED_Task Running,LED1_ONrn");
        
        LED1_OFF;     
        vTaskDelay(500);  	 		
        printf("LED_Task Running,LED1_OFFrn");
    }
}

        除了free rtos的idle空闲任务,这是唯一一个有意义的任务。它的工作其实就是一个死循环操作,LED点灯、延时、打印、LED灭灯、延时、打印,循环往复,没有终点。

本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
THE END
分享
二维码
< <上一篇
下一篇>>