做網(wǎng)站商城怎么樣國(guó)產(chǎn)長(zhǎng)尾關(guān)鍵詞拘挖掘
1.FreeRTOS的移植過(guò)程是將系統(tǒng)需要的文件和代碼進(jìn)行移植和裁剪,其移植的主要過(guò)程為:
(1)官網(wǎng)上下載FreeRTOS源碼:https://www.freertos.org/
(2)移植文件夾,在portable文件夾中只需要保留:Keil、MemMang、RVDS。
(3)代碼中的裁剪,修改相關(guān)的宏定義。
2.移植文件夾:
(1)首先在Keil的基本工程模板中創(chuàng)建一個(gè)文件夾FreeRTOS,用來(lái)存放FreeRTOS的源碼:
(2)將如下三個(gè)文件夾導(dǎo)入到FreeRTOS目錄下:
其中,Demo中存放的參考例程。License中是相關(guān)的許可信息。Source中便是FreeRTOS的源碼。
(3)裁剪Source中的文件:
Source中的文件信息如下
portable中存放是FreeRTOS和硬件之間的接口橋梁,在portable中只需要保留如下三個(gè)文件夾即可。
MemMang中存放是內(nèi)存管理相關(guān)的算法文件,本文選擇heap_c.c。
RVDS和Keil中存放是軟件和硬件之間的接口文件。本文的STM32是Coretex-M3系列,所以需要選擇ARM_CM3。
3.創(chuàng)建工程文件:
在基礎(chǔ)工程文件中創(chuàng)建兩個(gè)如下兩個(gè)文件夾用來(lái)存放FreeRTOS相關(guān)的文件:
添加文件:
4.導(dǎo)入頭文件的路徑:
5.移植FreeRTOSConfig.h文件:
FreeRTOSConfig.h是FreeRTOS的配置文件,通常FreeRTOS的裁剪都是通過(guò)修改此文件中的宏定義來(lái)實(shí)現(xiàn)。選擇芯片序號(hào)和開發(fā)環(huán)境對(duì)應(yīng)的文件:
將FreeRTOSConfig.h復(fù)制到自己的工程文件下,本文將FreeRTOSConfig.h放在include文件夾下:
6.代碼裁剪:
(1)添加宏定義,將STM32的PendSV_Handler、SVC_Handler、SysTick_Handler映射到FreeRTOS中。在FreeRTOS中添加如下三個(gè)宏定義:
(2)注釋stm32f10x_it.c中的SysTick_Handler()、SVC_Handler()和 PendSV_Handler()三個(gè)中斷服務(wù)函數(shù)。因?yàn)樵贔reeRTOS中已經(jīng)重新定義了這三個(gè)中斷服務(wù)函數(shù),所以此處需要注釋,防止重復(fù)定義。
7.創(chuàng)建任務(wù):
? (1)led.c
#include "led.h"void LED_Init(void)
{//?¨ò????úμ??á11ì?:GPIO_InitTypeDef GPIO_InitStruct;//1.ê1?üê±?ó£oRCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOD | RCC_APB2Periph_GPIOA,ENABLE);//2.???????ú?á11ì?μ??à1?D??¢£o£¨LED1£?GPIO_InitStruct.GPIO_Pin = GPIO_Pin_2;GPIO_InitStruct.GPIO_Mode = GPIO_Mode_Out_PP;GPIO_InitStruct.GPIO_Speed = GPIO_Speed_50MHz;GPIO_Init(GPIOD,&GPIO_InitStruct);//????LED0£oGPIO_InitStruct.GPIO_Pin = GPIO_Pin_8;GPIO_Init(GPIOA,&GPIO_InitStruct);//3?ê?ê±??LEDμ????ú?????a1£??′?¨?eGPIO_SetBits(GPIOA,GPIO_Pin_8);GPIO_SetBits(GPIOD,GPIO_Pin_2);
}
(2)main.c:
#include "stm32f10x.h"
#include "led.h"
#include "delay.h"
#include "FreeRTOS.h"
#include "task.h"TaskHandle_t led0_handler;
TaskHandle_t led1_handler;void led0(void)
{while(1){GPIO_ResetBits(GPIOA,GPIO_Pin_8); //′ò?aLEDvTaskDelay(500);GPIO_SetBits(GPIOA,GPIO_Pin_8); //′ò?aLEDvTaskDelay(500);}
}void led1(void)
{while(1){GPIO_ResetBits(GPIOD,GPIO_Pin_2); //′ò?aLEDvTaskDelay(1000);GPIO_SetBits(GPIOD,GPIO_Pin_2); //′ò?aLEDvTaskDelay(1000);}
}int main(void)
{NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);// éè???D??ó??è??·?×é2LED_Init();/*′′?¨è???*/xTaskCreate((TaskFunction_t) led0, //è???oˉêy(const char *)"led0_task", //è?????3?(uint16_t)50, //è???????′óD?(void *)NULL, //′?μY??è???oˉêyμ?2?êy(UBaseType_t)1, //è???ó??è??(TaskHandle_t *)&led0_handler); //è?????±úxTaskCreate((TaskFunction_t) led1,(const char *)"led1_task",(uint16_t)50,(void *)NULL,(UBaseType_t)1,(TaskHandle_t *)&led1_handler);vTaskStartScheduler(); //?aê?è???μ÷?è
}
8.運(yùn)行結(jié)果:本文的運(yùn)行結(jié)果是兩個(gè)LED燈閃爍,其中l(wèi)ed0每500ms閃爍一次,led1每1000ms閃爍一次。
9.總結(jié):
FreeRTOS的移植過(guò)程主要是對(duì)相關(guān)的文件和代碼進(jìn)行裁剪。需要去了解每個(gè)文件夾中代碼的大搞功能,才可以正確的移植文件。
此外,當(dāng)使用xTaskGetSchedulerState()函數(shù)時(shí),需要將FreeRTOS.h中的對(duì)應(yīng)宏定義改為1: