關於FreeRTOS移植到STM32F103上的步驟以及注意事項
因為最近比較有時間,而且發現自己對於STM上可以跑的作業系統相對陌生。所以選擇幾個作業系統進行移植和玩幾個DEMO理解一下。雖然理解的不是很深入,但是如果專案需要的話,只是移植,進行多工的操作。應付一下還是綽綽有餘的。之前移植了uCosII.後續有需要會總結一下。這裡先對FreeRTOS相關的問題進行總結。因為個人能力有限。有什麼不對的地方請大家批評,寫這個主要是為了記錄一下自己的移植過程。
1、第一步肯定是先到官網去下載關於FreeRTOS的原始碼
下面的網址是官方最新原始碼的下載地址:
目前官方提供的最新版本是v9.0.0, FreeRTOS原始碼在解壓目錄下的路徑為FreeRTOS_V9.0.0rc2\FreeRTOS\Source
2、下載完,進行安裝。安裝完你會得到如下目錄的檔案
我們需要的是FreeRTOS這個目錄的檔案。而關於-Plus的使用,目前小弟並沒有試過。大家可以試試,好玩記得推薦哦。
3、進入FreeRTOS目錄,你會發現裡面有三個資料夾,分別是Demo,License,Source。在Demo中,我們能看到很多不同平臺的移植例程,這個很好的,有相關不懂的平臺,完全可以用來參考使用。因為我們是在MDK下移植。所以選擇CORTEX_STM32F103_Keil這個資料夾的內容進行參考,其實這個Demo還是很有幫助的,後續你在移植的時候,會發現缺少的檔案都可以在這個Demo中進行直接拿來使用。選擇介紹另一個資料夾的主要用途。
另一個資料夾是Source.這個目錄下的檔案主要有
include這個目錄,我建議大家如果不是很清楚哪些要用,哪些不用的要,都可以新增進工程中。重點是這個portable資料夾,裡面的東西比較多。而我們主要用到的目錄有下面幾個。關於不同的平臺,大家可以自己選擇哦。
其實你會發現,你進入Keil中,其實沒有東西,就是告訴你,這個目錄和RVDS中的是一樣的操作。所以你需要進入RVDS中。把關於你平臺核心的檔案拷貝過來。小弟這邊使用的M3核心,所以拷貝後如下。還有這個MemMang一定要記得拿過來,很重要哦。因為關於記憶體的管理都是在這裡面呢。
接下來介紹下根目錄下的這個幾個原始檔,我們需要用到的就只有幾個,如果只是移植看一下加入作業系統後的執行情況。
現在,我們需要移植的檔案大概就只有這些哦。現在就可以建立一個簡單的工程了。關於工程建立,這邊就不多說啦。大家不會的話,可以自己參考網上的例程或者正點原子中不完全手冊上的教程哦。現在小弟建立工程並新增進相關檔案如下:
其中port.c就是在ARM_CM3中找。heap_4.c就是在MenMang中找。裡面有不同的記憶體管理方案,大家可以根據需要選擇自己想要的方案,小弟這邊選的是heap_4.c.現在要說一個最最騷的問題了,就是你新增完這些檔案。然後點選編譯,如果你預設的是選擇系統的啟動檔案,就會報出很多錯誤。還有就是會缺少一個檔案叫做FreeRTOSConfig.h,你會發現這個檔案在原始碼中並找不到。所以剛才說了哦,Demo很重要呢。就是要到Demo中去找到這個檔案,並且新增進去。還有就是啟動檔案,如果你看不出那些錯誤怎麼改,也拿Demo中的啟動檔案啦。有時候,我們需要的是應用,如果你有時間並且很多興趣,你就可以一步步進行理解操作哦。小弟這邊是試驗。所以直接拿了STM32F10x.s這個啟動檔案,後續的話,應該會進行對比分析,再跟大家分享。
最後就是跟你的需要新增一些檔案進去哦,如果你用的是庫函式開發,記得關於stm32f10x_conf.h、#include "stm32f10x.h"這些檔案很重要哦。記得去Demo中找,如果丟失會很麻煩呢,很多地方編譯都不會通過。還有就是庫函式開發的話,這邊一個地方要設定,不然也編譯不過呢
現在看一下main.c函式的主要操作
#include "led.h"
#include "stm32f10x_rcc.h"
#include "stm32f10x.h"
#include "misc.h"
#include "FreeRTOS.h"
#include "task.h"
#include "usart.h"
void LedTask1(void *pvParameters )
{
while(1)
{
printf("i am LedTask1\r\n");
//vTaskDelay(100 / portTICK_RATE_MS);
LED0_OFF;
vTaskDelay(500 / portTICK_RATE_MS);
LED0_ON;
vTaskDelay(500 / portTICK_RATE_MS);
}
}
void LedTask2(void *pvParameters ){
while(1)
{
printf("i am LedTask2\r\n");
vTaskDelay(10 / portTICK_RATE_MS);
// LED1_OFF;
// vTaskDelay(500 / portTICK_RATE_MS);
// LED1_ON;
// vTaskDelay(500 / portTICK_RATE_MS);
}
}
int main()
{
NVIC_PriorityGroupConfig(NVIC_PriorityGroup_4);
RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO, ENABLE);
//GPIO_PinRemapConfig(GPIO_Remap_SWJ_JTAGDisable, ENABLE);
uart_init(9600);
LED_Init();
printf("init sucess\r\n");
//堆疊深度(字) //任務引數 //任務優先順序 //任務控制程式碼
xTaskCreate(LedTask1,"LED_TASK1",40,NULL,1,NULL);
xTaskCreate(LedTask2,"LED_TASK2",40,NULL,2,NULL);
vTaskStartScheduler(); //啟動任務排程器
return 0;
}
根據需求新增哦。我這邊是用LED燈和串列埠進行驗證是否移植成功。所以新增了關於LED和USART的模組程式碼。這邊有個注意的地方是。你的建立的任務一定記得在後面加上一點延遲。不然的話,很容易出錯,你想看到的效果,就看不到啦。像小弟這個Demo,效果就是LED燈5秒閃爍一次。然後串列埠交替列印資訊。
好了。目前簡單的移植就這些啦,是不是覺得很簡單呢。因為現在很多物聯網小模組,可能只需要接收和處理資料。然後上傳之類的。用上一個作業系統,可能會比較好哦,畢竟簡單的處理。
相關文章
- FreeRTOS移植到STM32F103步驟
- vite構建專案步驟以及所遇到的坑,要注意的事項Vite
- 關於 interface{} 會有啥注意事項?上
- 安裝 Nuxt.js 的步驟和注意事項UXJS
- 關於MongoDB的幾點注意事項UMMongoDB
- android 原生混編 flutter 並使用 flutter_boost進行跳轉的步驟以及注意事項AndroidFlutter
- 關於Golang struct{}{}用法和注意事項GolangStruct
- 關於mysqldump備份非事務表的注意事項MySql
- 關於GPIO合封引腳以及晶振引腳使用注意事項
- iOS開發中整合FFmpeg以及相關注意事項iOS
- cookie的使用方法以及注意事項Cookie
- 關於 interface{} 會有啥注意事項?下
- XtraBackup 搭建從庫的一般步驟及 XtraBackup 8.0 的注意事項
- React生命週期以及注意事項React
- WebView與JS的互動,以及注意事項WebViewJS
- FreeRTOS移植EasyFlash
- dubbo相關配置以及注意項
- PureComponent 使用注意事項以及原始碼解析原始碼
- Mysql索引以及使用索引注意事項MySql索引
- RPA專案中關於資訊配置表的注意事項
- 開發及上線中的注意事項
- GO 中的 defer 有哪些注意事項?上Go
- 需要提醒你關於 golang 中 map 使用的幾點注意事項Golang
- 關停一個產品的注意事項
- FreeRTOS移植需要做的主要工作
- 【親身經歷】關於在godaddy競拍域名注意事項Go
- php大檔案上傳注意事項PHP
- RandomAccessFile注意事項randomMac
- @Lombok注意事項Lombok
- 換工作的注意事項
- Oracle使用*的注意事項Oracle
- STM32移植FreeRTOS(1)
- stm32 移植 freeRTOS 的資訊
- Laravel 專案上線的一些注意事項Laravel
- Mysql設計與查詢的關鍵注意事項MySql
- 幾種簡潔建立執行緒的方式以及使用注意事項執行緒
- MySQL 8.0.20 MGR資料遷移過程以及注意事項MySql
- SQL 語句的注意事項SQL