FreeRTOS学习笔记(一)

FreeRTOS学习笔记(一)

一.在stm32f10x上的移植(vet6)


1.源文件的获取

​ 官方网站:https://www.freertos.org/


2.源文件的拷贝和理解

1. FreeRTOS系统层源代码

  • /Source下的.c文件

    在工程目录下创建freeRTOS_core文件夹,用来存放/Suorce文件里的.c文件

  • /Source/include下的.h文件

    直接将整个文件夹放入freeRTOS_core文件夹里

2. FreeRTOS接口层代码

  • /Source/portable/RVDS

    在工程目录下创建freeRTOS_port文件夹整个文件夹放入工程目录下的freeRTOS_port文件夹中

3. FreeRTOS内存管理方案

  • /Source/portable/MemMang

    heap_1~5.c,表示freeRTOS的5种内存管理方案,通常选择heap_4.c,整个文件夹考入port文件夹中

4. FreeRTOS系统配置文件

  • FreeRTOSConfig.h

    需要自己创建或者从Demo中拷贝,主要用于配置系统相关功能


3.在startcode中重定向中断入口函数

​ port.c文件中,有3个freeRTOS的Exception handlers函数需要被设置为相应的中断入口

1.xPortPendSVHandler

2.xPortSysTickHandler

3.vPortSVCHandler

​ 这三个函数是连接硬件设备的重要桥梁,需要在statrtcode将相应中断入口中重新定向至这三个函数

​ *****1和3是由内联汇编编写的函数,主要用于上下文切换,使用汇编能大大提高切换速率,减少切换过程中关闭中断的时间,增强系统的稳定性


4.freeRTOSConfig.h的编写或修改

​ 添加Demo中的freeRTOSConfig.h后,编译会发现xTaskGetCurrentTaskHandle() 没有被定义,导致编译无法通过。这个函数的主要作用是获取当前任务的句柄,报错的地方出现在stream_buffer.c中。这时候转到定义,发现有一个条件宏

#if ( ( INCLUDE_xTaskGetCurrentTaskHandle == 1 ) || ( configUSE_MUTEXES == 1 ) )

    TaskHandle_t xTaskGetCurrentTaskHandle( void )
    {
        TaskHandle_t xReturn;

        /* A critical section is not required as this is not called from
         * an interrupt and the current TCB will always be the same for any
         * individual execution thread. */
        xReturn = pxCurrentTCB;

        return xReturn;
    }

#endif 

原因是 INCLUDE_xTaskGetCurrentTaskHandle 和 configUSE_MUTEXES 都没有被定义导致函数没有定义,只要在freeRTOSConfig.h前加入相关宏定义即可编译通过


5.freeRTOS移植测试

​ 做一个简单的bsp(板级支持包),初始化一个led或者串口

#include "stm32f10x.h"
#include "FreeRTOS.h"
#include "task.h"
#include "bsp_led.h"

static void LED_TestApp(void*ptr);		//声明任务函数
static TaskHandle_t LED_Handle = NULL;	//任务句柄

int main(void)
{
	NVIC_PriorityGroupConfig(NVIC_PriorityGroup_4);	//任务分组
	BSP_LED_Init();									//LED初始化
    //创建一个led闪烁的任务
	xTaskCreate((TaskFunction_t )LED_TestApp,		
                (const char*    )"LED_Test",
                (uint16_t       )256 ,
                (void*          )NULL,
                (UBaseType_t    )1,
                (TaskHandle_t*  )&LED_Handle);        
    vTaskStartScheduler(); 		//开启任务调度
	while(1);
}

void LED_TestApp(void*ptr)				//移植成功验证任务
{
	while(1)
    {
        BSP_LED_CTR(0,LED_Off);
        vTaskDelay(500/portTICK_RATE_MS);
        BSP_LED_CTR(0,LED_On);
        vTaskDelay(500/portTICK_RATE_MS);
    }
}

​ led按照预定时间闪烁,freeRTOS移植成功

  • 7
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值