0. 將freeRTOS(版本號(hào)FreeRTOSv9.0.0)移植到STM32F10x

Date:2016.06.01

步驟

  • 新建一個(gè)MDK5工程
  • stm32f10x相關(guān)文件導(dǎo)入
  • 工程設(shè)置
  • 裸奔點(diǎn)燈
  • freeRTOS系統(tǒng)文件導(dǎo)入
  • 點(diǎn)個(gè)高級(jí)燈再試試

新建一個(gè)MDK5工程

  • 新建工程目錄和文件目錄


    工程結(jié)構(gòu)
對(duì)應(yīng)的文件結(jié)構(gòu)

stm32f10x相關(guān)文件導(dǎo)入

  1. 庫(kù)文件導(dǎo)入
    將..\STM32F10x_StdPeriph_Lib_V3.5.\Libraries\STM32F10x_StdPeriph_Driver
    整個(gè)文件夾復(fù)制到\lib下

  2. 內(nèi)核和啟動(dòng)代碼導(dǎo)入
    2.0 將以下所有文件復(fù)制到\core
    2.1 core_cm3.c和core_cm3.h位于:
    ..\STM32F10x_StdPeriph_Lib_V3.5.0\Libraries\CMSIS\CM3\CoreSupport
    2.2 startup_stm32f10x_hd.s位于:
    ..\STM32F10x_StdPeriph_Lib_V3.5.0\Libraries\CMSIS\CM3\DeviceSupport\ST\STM32F10x\startup\arm
    2.3 stm32f10x.h墙贱,system_stm32f10x.c捐顷,system_stm32f10x.h位于:
    ..\STM32F10x_StdPeriph_Lib_V3.5.0\Libraries\CMSIS\CM3 \DeviceSupport\ST\STM32F10x
    2.4 stm32f10x_conf.h猖败,stm32f10x_it.c立轧,stm32f10x_it.h位于:
    ..\STM32F10x_StdPeriph_Lib_V3.5.0\Project\STM32F10x_StdPeriph_Template


工程設(shè)置

  1. 將文件導(dǎo)入工程


    文件目錄
  2. Obj路徑設(shè)置并勾選生成hex文件


    Obj路徑設(shè)置并勾選生成hex文件
  3. 頭文件路徑設(shè)置


    頭文件路徑設(shè)置
  4. 全局宏定義變量設(shè)置


    全局宏定義變量設(shè)置
  5. JLink設(shè)置


    JLink設(shè)置1

    JLink設(shè)置2

裸奔點(diǎn)燈

  1. 在\init下添加一個(gè)main.c
#include "stm32f10x.h"  
#include "stm32f10x_it.h"  

void Delay(u32 count) {     
    u32 i=0;     
    for(;i<count;i++);  
}  

void LED_config() {
    GPIO_InitTypeDef  GPIO_InitStructure;       
    RCC_APB2PeriphClockCmd(  RCC_APB2Periph_GPIOA
                           | RCC_APB2Periph_GPIOD,  
                             ENABLE
                           );      
    GPIO_InitStructure.GPIO_Pin   = GPIO_Pin_8;     
    GPIO_InitStructure.GPIO_Mode  = GPIO_Mode_Out_PP;    
    GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
    
    GPIO_Init( GPIOA, &GPIO_InitStructure );    
    GPIO_SetBits( GPIOA, GPIO_Pin_8 );
    
    GPIO_InitStructure.GPIO_Pin   = GPIO_Pin_2;
    GPIO_Init( GPIOD, &GPIO_InitStructure);      
    GPIO_SetBits( GPIOD, GPIO_Pin_2 ); 
}

int main(void) {  
    LED_config();

    while(1) {  
        GPIO_ResetBits(GPIOA,GPIO_Pin_8);      
        GPIO_SetBits(GPIOD,GPIO_Pin_2);   
        Delay(3000000);   
        
        GPIO_SetBits(GPIOA,GPIO_Pin_8);   
        GPIO_ResetBits(GPIOD,GPIO_Pin_2);   
        Delay(3000000); 
    }  
    
}

freeRTOS系統(tǒng)文件導(dǎo)入

  1. 與FreeRTOS內(nèi)核有關(guān)的文件:list.c, queue.c, tasks.c
    位于..\FreeRTOSv9.0.0\FreeRTOS\Source
    復(fù)制到lib\freeRTOS\src

  2. 與內(nèi)存分配有關(guān)的文件: heap_1.c,heap_2.c,heap_3.c玷氏,heap_4.c,heap_5.c腋舌。五選一盏触,STM32選擇heap_2.c
    位于..\FreeRTOSv9.0.0\FreeRTOS\Source\portable\MemMang
    復(fù)制到lib\freeRTOS\src

  3. 移植平臺(tái)相關(guān)文件port.c
    位于..\FreeRTOSv9.0.0\FreeRTOS\Source\portable\RVDS\ARM_CM3
    復(fù)制到lib\freeRTOS\src

  4. 配置文件portmacro.h,F(xiàn)reeRTOSConfig.h
    分別位于
    ..\FreeRTOSv9.0.0\FreeRTOS\Source\portable\RVDS\ARM_CM3
    ..\FreeRTOSv9.0.0\FreeRTOS\Demo\CORTEX_STM32F103_Keil
    復(fù)制到lib\freeRTOS\inc

  5. 通用代碼文件
    將..\FreeRTOSv9.0.0\FreeRTOS\Source\include下的所有文件
    復(fù)制到lib\freeRTOS\inc

  6. 將freeRTOS系統(tǒng)文件導(dǎo)入工程結(jié)構(gòu)


    freeRTOS架構(gòu)
  7. 更改啟動(dòng)文件startup_stm32f10x_hd.s
    . 更改1

    增加代碼的位置

    加三行

    具體代碼:

__heap_limit

                PRESERVE8
                THUMB
                    
                IMPORT xPortPendSVHandler   ; insert for freeRTOS 
                IMPORT xPortSysTickHandler  ; insert for freeRTOS
                IMPORT vPortSVCHandler      ; insert for freeRTOS 

. 更改2


紅圈處注釋掉
修改為

具體代碼:

__Vectors       DCD     __initial_sp               ; Top of Stack
                DCD     Reset_Handler              ; Reset Handler
                DCD     NMI_Handler                ; NMI Handler
                DCD     HardFault_Handler          ; Hard Fault Handler
                DCD     MemManage_Handler          ; MPU Fault Handler
                DCD     BusFault_Handler           ; Bus Fault Handler
                DCD     UsageFault_Handler         ; Usage Fault Handler
                DCD     0                          ; Reserved
                DCD     0                          ; Reserved
                DCD     0                          ; Reserved
                DCD     0                          ; Reserved
               ; DCD     SVC_Handler                ; SVCall Handler
                DCD     vPortSVCHandler            ; change for freeRTOS
                DCD     DebugMon_Handler           ; Debug Monitor Handler
                DCD     0                          ; Reserved
               ; DCD     PendSV_Handler             ; PendSV Handler
               ; DCD     SysTick_Handler            ; SysTick Handler
                DCD     xPortPendSVHandler         ; change for freeRTOS
                DCD     xPortSysTickHandler        ; change for freeRTOS

點(diǎn)個(gè)高級(jí)燈再試試
. 更改main.c中的內(nèi)容為:


#include "stm32f10x.h"  
#include "stm32f10x_it.h" 
#include "FreeRTOS.h"  
#include "task.h" 
#include "queue.h" 
#include "list.h"  
#include "portable.h"  
#include "FreeRTOSConfig.h" 
 
void LED_config() {
    GPIO_InitTypeDef  GPIO_InitStructure;       
    RCC_APB2PeriphClockCmd(  RCC_APB2Periph_GPIOA
                           | RCC_APB2Periph_GPIOD,  
                             ENABLE
                           );      
    GPIO_InitStructure.GPIO_Pin   = GPIO_Pin_8;     
    GPIO_InitStructure.GPIO_Mode  = GPIO_Mode_Out_PP;    
    GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
    
    GPIO_Init( GPIOA, &GPIO_InitStructure );    
    GPIO_SetBits( GPIOA, GPIO_Pin_8 );
    
    GPIO_InitStructure.GPIO_Pin   = GPIO_Pin_2;
    GPIO_Init( GPIOD, &GPIO_InitStructure);      
    GPIO_SetBits( GPIOD, GPIO_Pin_2 ); 
}
 
void  vLED_1_Task( void *pvParameters ) {  
    while( 1 ) {  
        GPIO_ResetBits( GPIOA, GPIO_Pin_8 );  
        vTaskDelay( 1000 / portTICK_RATE_MS );   
        GPIO_SetBits( GPIOA, GPIO_Pin_8);    
        vTaskDelay( 2000 / portTICK_RATE_MS );  
    }  
}

void  vLED_2_Task( void *pvParameters ) {  
    while( 1 ) {  
        GPIO_SetBits( GPIOD, GPIO_Pin_2); 
        vTaskDelay( 1000 / portTICK_RATE_MS );   
        GPIO_ResetBits( GPIOD, GPIO_Pin_2);   
        vTaskDelay( 1000 / portTICK_RATE_MS );  
    }  
} 

int main(void) {  
    
    LED_config();  
    
    xTaskCreate( vLED_1_Task, "LED1",configMINIMAL_STACK_SIZE,NULL,tskIDLE_PRIORITY+1 ,NULL);        
    xTaskCreate( vLED_2_Task, "LED2",configMINIMAL_STACK_SIZE,NULL,tskIDLE_PRIORITY+2 ,NULL);
    
    vTaskStartScheduler();
    
    return 0;
    
}

. 注意freeRTOSConfig.h中的配置

#define configUSE_PREEMPTION        1
#define configUSE_IDLE_HOOK         0
#define configUSE_TICK_HOOK         0
#define configCPU_CLOCK_HZ          ( ( unsigned long ) 72000000 )  
#define configTICK_RATE_HZ          ( ( TickType_t ) 1000 )
#define configMAX_PRIORITIES        ( 5 )
#define configMINIMAL_STACK_SIZE    ( ( unsigned short ) 128 )
#define configTOTAL_HEAP_SIZE       ( ( size_t ) ( 17 * 1024 ) )
#define configMAX_TASK_NAME_LEN     ( 16 )
#define configUSE_TRACE_FACILITY    0
#define configUSE_16_BIT_TICKS      0
#define configIDLE_SHOULD_YIELD     1
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末块饺,一起剝皮案震驚了整個(gè)濱河市赞辩,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌授艰,老刑警劉巖辨嗽,帶你破解...
    沈念sama閱讀 206,378評(píng)論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異淮腾,居然都是意外死亡糟需,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,356評(píng)論 2 382
  • 文/潘曉璐 我一進(jìn)店門谷朝,熙熙樓的掌柜王于貴愁眉苦臉地迎上來洲押,“玉大人,你說我怎么就攤上這事圆凰¤菊剩” “怎么了?”我有些...
    開封第一講書人閱讀 152,702評(píng)論 0 342
  • 文/不壞的土叔 我叫張陵专钉,是天一觀的道長(zhǎng)挑童。 經(jīng)常有香客問我,道長(zhǎng)跃须,這世上最難降的妖魔是什么站叼? 我笑而不...
    開封第一講書人閱讀 55,259評(píng)論 1 279
  • 正文 為了忘掉前任,我火速辦了婚禮菇民,結(jié)果婚禮上尽楔,老公的妹妹穿的比我還像新娘投储。我一直安慰自己,他們只是感情好翔试,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,263評(píng)論 5 371
  • 文/花漫 我一把揭開白布轻要。 她就那樣靜靜地躺著复旬,像睡著了一般垦缅。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上驹碍,一...
    開封第一講書人閱讀 49,036評(píng)論 1 285
  • 那天壁涎,我揣著相機(jī)與錄音,去河邊找鬼志秃。 笑死怔球,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的浮还。 我是一名探鬼主播竟坛,決...
    沈念sama閱讀 38,349評(píng)論 3 400
  • 文/蒼蘭香墨 我猛地睜開眼,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼钧舌!你這毒婦竟也來了担汤?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 36,979評(píng)論 0 259
  • 序言:老撾萬榮一對(duì)情侶失蹤洼冻,失蹤者是張志新(化名)和其女友劉穎崭歧,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體撞牢,經(jīng)...
    沈念sama閱讀 43,469評(píng)論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡率碾,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 35,938評(píng)論 2 323
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了屋彪。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片所宰。...
    茶點(diǎn)故事閱讀 38,059評(píng)論 1 333
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖畜挥,靈堂內(nèi)的尸體忽然破棺而出歧匈,到底是詐尸還是另有隱情,我是刑警寧澤砰嘁,帶...
    沈念sama閱讀 33,703評(píng)論 4 323
  • 正文 年R本政府宣布件炉,位于F島的核電站,受9級(jí)特大地震影響矮湘,放射性物質(zhì)發(fā)生泄漏斟冕。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,257評(píng)論 3 307
  • 文/蒙蒙 一缅阳、第九天 我趴在偏房一處隱蔽的房頂上張望磕蛇。 院中可真熱鬧景描,春花似錦、人聲如沸秀撇。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,262評(píng)論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽呵燕。三九已至棠绘,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間再扭,已是汗流浹背氧苍。 一陣腳步聲響...
    開封第一講書人閱讀 31,485評(píng)論 1 262
  • 我被黑心中介騙來泰國(guó)打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留泛范,地道東北人让虐。 一個(gè)月前我還...
    沈念sama閱讀 45,501評(píng)論 2 354
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像罢荡,于是被迫代替她去往敵國(guó)和親赡突。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,792評(píng)論 2 345

推薦閱讀更多精彩內(nèi)容