国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

【學(xué)習(xí)日記】【FreeRTOS】FreeRTOS 移植到 STM32F103C8

這篇具有很好參考價(jià)值的文章主要介紹了【學(xué)習(xí)日記】【FreeRTOS】FreeRTOS 移植到 STM32F103C8。希望對(duì)大家有所幫助。如果存在錯(cuò)誤或未考慮完全的地方,請(qǐng)大家不吝賜教,您也可以點(diǎn)擊"舉報(bào)違法"按鈕提交疑問。

前言

本文基于野火 FreeRTOS 教程,內(nèi)容是關(guān)于 FreeRTOS 官方代碼的移植的注意事項(xiàng),并將野火例程中 STM32F103RC 代碼移植到 STM32F103C8。

一、FreeRTOS V9.0.0 源碼的獲取

  • 兩個(gè)下載鏈接:
    官 網(wǎng)
    代碼托管

二、源碼文件夾內(nèi)容簡介

  • Source:內(nèi)核源碼,我們需要的主要內(nèi)容
    • 根目錄:這里的 C 文件都是由 C 語言編寫的,所以在各種單片機(jī)上是通用的
    • include:上述 C 文件的頭文件
    • portable:存放不同編譯器和不同板子使用的接口文件(大部分使用匯編編寫,為了適配不同的板子)
      • KEIL:存放 port.c 接口文件,portmacro.h 是其頭文件
      • MemMang:存放內(nèi)存管理相關(guān)文件,主要是動(dòng)態(tài)內(nèi)存(堆)的配置,我們使用第四個(gè)
  • Demo:一些官方的例程(FreeRTOS 不只可以用在 STM32 上,其他單片機(jī)上也可以使用,這些例程中有專門為 STM32F1系列寫的配置,也需要移植)

所謂移植,本意是將代碼適配我們需要使用的單片機(jī),也就是軟件得和硬件相匹配的過程。

但是在這里,和硬件相匹配的接口文件 port.c 已經(jīng)由官方寫好了,我們需要的只是將這些文件放入我們的 keil 工程中,實(shí)際上是使用官方的移植的過程。

詳細(xì)的工程添加文件過程,請(qǐng)查看野火的教程。

三、FreeRTOSConfig.h 文件內(nèi)容部分說明

FreeRTOSConfig.h 中,有如下這些代碼:

/******************************************************************
            FreeRTOS與中斷有關(guān)的配置選項(xiàng)                                                 
******************************************************************/
#ifdef __NVIC_PRIO_BITS
	#define configPRIO_BITS       		__NVIC_PRIO_BITS
#else
	#define configPRIO_BITS       		4                  
#endif
//中斷最低優(yōu)先級(jí)
#define configLIBRARY_LOWEST_INTERRUPT_PRIORITY			15     

//系統(tǒng)可管理的最高中斷優(yōu)先級(jí)
#define configLIBRARY_MAX_SYSCALL_INTERRUPT_PRIORITY	5 

#define configKERNEL_INTERRUPT_PRIORITY 		( configLIBRARY_LOWEST_INTERRUPT_PRIORITY << (8 - configPRIO_BITS) )	/* 240 */

#define configMAX_SYSCALL_INTERRUPT_PRIORITY 	( configLIBRARY_MAX_SYSCALL_INTERRUPT_PRIORITY << (8 - configPRIO_BITS) )

首先我們先捋清楚一個(gè)概念, FreeRTOS 是在 STM32 原有的架構(gòu)上實(shí)現(xiàn)的,也就是說,我們?cè)诳紤] FreeRTOS 的各種細(xì)節(jié)的時(shí)候不能忘記 STM32 裸機(jī)的各種細(xì)節(jié)。比如裸機(jī)上的優(yōu)先級(jí)分配等等。

  • configLIBRARY_LOWEST_INTERRUPT_PRIORITY:用于配置 STM32 的中斷最低優(yōu)先級(jí),這里配置為 15,也就是總共有 0 - 15 共 16 個(gè)優(yōu)先級(jí)。
    注意,這里說的 STM32 的中斷優(yōu)先級(jí)和 FreeRTOS 的中斷優(yōu)先級(jí)不同,注意區(qū)分。
    STM32 的中斷優(yōu)先級(jí):Cortex 內(nèi)核的各種優(yōu)先級(jí),越小優(yōu)先級(jí)越高
    FreeRTOS 的中斷優(yōu)先級(jí):在 STM32 的中斷優(yōu)先級(jí)上實(shí)現(xiàn)的任務(wù)優(yōu)先級(jí),越大優(yōu)先級(jí)越高

  • configLIBRARY_MAX_SYSCALL_INTERRUPT_PRIORITY:用于配置 FreeRTOS 可以管理的最高的中斷優(yōu)先級(jí)。這里配置為 5,結(jié)合上面 STM32 的中斷優(yōu)先級(jí)配置共 15 級(jí),那么意味著 FreeRTOS 可以管理的 STM32 的中斷優(yōu)先級(jí)為 5 - 15,而0 - 4 FreeRTOS 就管不了。

Q:那為什么 FreeRTOS 要對(duì) STM32 的優(yōu)先級(jí)進(jìn)行管理呢?
A:很重要的一點(diǎn)是前幾篇文章提到過的臨界段的保護(hù)。
還記得嗎,由于 FreeRTOS 的并發(fā)性,F(xiàn)reeRTOS 需要確保執(zhí)行一些代碼的時(shí)候不能被中斷打斷,很常見的就是對(duì)共享資源的訪問,比如全局變量的修改。在訪問共享資源前我們需要先屏蔽中斷,修改完畢后再開啟,這就是臨界端的保護(hù),也就是 FreeRTOS 要對(duì) STM32 的中斷進(jìn)行管理的原因。
這里貼上臨界段保護(hù)的文章:臨界段保護(hù)

四、移植到 STM32F103C8

由于野火的例程中并沒有 STM32F1C8T6 這個(gè)芯片,所以我們只能自己移植。

STM32 不同的芯片的命名表示如下:
【學(xué)習(xí)日記】【FreeRTOS】FreeRTOS 移植到 STM32F103C8,RTOS,學(xué)習(xí),stm32,嵌入式硬件,RTOS

我們使用 STM32F1RC 這個(gè)芯片進(jìn)行移植??梢钥吹?C 表示 256K 字節(jié)的閃存,而 C8T6 只有 64K 字節(jié)。移植主要是根據(jù)不同的閃存容量進(jìn)行配置的。

根據(jù)不同容量,有 ld、md、hd 三種縮寫:
【學(xué)習(xí)日記】【FreeRTOS】FreeRTOS 移植到 STM32F103C8,RTOS,學(xué)習(xí),stm32,嵌入式硬件,RTOS
我們需要把 RC 中所有的 hd 都修改為 md進(jìn)行移植。

移植分為基礎(chǔ)的編譯器移植設(shè)置和針對(duì) FreeRTOS 的代碼修改兩個(gè)步驟:

1. 基礎(chǔ)設(shè)置

① 編譯器的設(shè)置

  • 點(diǎn)擊工程配置選項(xiàng)
    【學(xué)習(xí)日記】【FreeRTOS】FreeRTOS 移植到 STM32F103C8,RTOS,學(xué)習(xí),stm32,嵌入式硬件,RTOS

  • 修改芯片,選擇 STM32F1C8
    【學(xué)習(xí)日記】【FreeRTOS】FreeRTOS 移植到 STM32F103C8,RTOS,學(xué)習(xí),stm32,嵌入式硬件,RTOS

  • 晶振頻率的修改
    【學(xué)習(xí)日記】【FreeRTOS】FreeRTOS 移植到 STM32F103C8,RTOS,學(xué)習(xí),stm32,嵌入式硬件,RTOS

  • 定義從 STM32F10X_HD 修改為 STM32F10X_MD
    【學(xué)習(xí)日記】【FreeRTOS】FreeRTOS 移植到 STM32F103C8,RTOS,學(xué)習(xí),stm32,嵌入式硬件,RTOS

② 啟動(dòng)文件的修改

這個(gè)啟動(dòng)文件就是在執(zhí)行 main 函數(shù)之前執(zhí)行的一個(gè)文件。

需要從 startup_stm32f10x_hd.s 換為 startup_stm32f10x_md.s

  • 從組中移除 hd 啟動(dòng)文件:
    【學(xué)習(xí)日記】【FreeRTOS】FreeRTOS 移植到 STM32F103C8,RTOS,學(xué)習(xí),stm32,嵌入式硬件,RTOS
  • 添加 md 啟動(dòng)文件(一般在項(xiàng)目目錄下就有)(…\Libraries\CMSIS\startup):
    【學(xué)習(xí)日記】【FreeRTOS】FreeRTOS 移植到 STM32F103C8,RTOS,學(xué)習(xí),stm32,嵌入式硬件,RTOS
  • 如果項(xiàng)目工程下沒有,可以打開 KEIL 的安裝目錄,在C:\Keil\ARM\PACK\Keil\STM32F1xx_DFP\2.2.0\Device\Source\ARM這個(gè)路徑下找
    【學(xué)習(xí)日記】【FreeRTOS】FreeRTOS 移植到 STM32F103C8,RTOS,學(xué)習(xí),stm32,嵌入式硬件,RTOS
    至此,基礎(chǔ)設(shè)置已經(jīng)全部設(shè)置好了,但是如果我們此刻進(jìn)行編譯,可能會(huì)出現(xiàn)空間不足的錯(cuò)誤。如下:
..\..\Output\Fire_FreeRTOS.axf: Error: L6406E: No space in execution regions with .ANY selector matching heap_4.o(.bss).
..\..\Output\Fire_FreeRTOS.axf: Error: L6406E: No space in execution regions with .ANY selector matching startup_stm32f10x_md.o(STACK).
..\..\Output\Fire_FreeRTOS.axf: Error: L6406E: No space in execution regions with .ANY selector matching tasks.o(.bss).
..\..\Output\Fire_FreeRTOS.axf: Error: L6406E: No space in execution regions with .ANY selector matching tasks.o(.data).
..\..\Output\Fire_FreeRTOS.axf: Error: L6406E: No space in execution regions with .ANY selector matching heap_4.o(.data).
..\..\Output\Fire_FreeRTOS.axf: Error: L6406E: No space in execution regions with .ANY selector matching system_stm32f10x.o(.data).
..\..\Output\Fire_FreeRTOS.axf: Error: L6406E: No space in execution regions with .ANY selector matching stm32f10x_rcc.o(.data).
..\..\Output\Fire_FreeRTOS.axf: Error: L6406E: No space in execution regions with .ANY selector matching port.o(.data).
..\..\Output\Fire_FreeRTOS.axf: Error: L6406E: No space in execution regions with .ANY selector matching stdout.o(.data).
..\..\Output\Fire_FreeRTOS.axf: Error: L6407E: Sections of aggregate size 0x9770 bytes could not fit into .ANY selector(s).
Not enough information to list image symbols.
Not enough information to list load addresses in the image map.
Finished: 2 information, 0 warning and 10 error messages.
"..\..\Output\Fire_FreeRTOS.axf" - 10 Error(s), 0 Warning(s).
Target not created.
Build Time Elapsed:  00:00:02

這是由于 FreeRTOS 中對(duì)于容量的配置出錯(cuò),接著往下看。

2. FreeRTOS 的代碼修改

打開 FreeRTOSConfig.h 文件進(jìn)行配置,找到這個(gè)宏定義,它的作用是在 FreeRTOS 中定義系統(tǒng)可用的整個(gè)堆的大小,如果設(shè)置得太大了就會(huì)出現(xiàn)上文所說的空間不足的報(bào)錯(cuò)。

原來設(shè)置的大小是 ((size_t)(36*1024)) ,這里的 size_t 是 unsigned int,也就是 4 個(gè)字節(jié),在 STM32 中是 1 個(gè)字的大小。

#define configTOTAL_HEAP_SIZE					((size_t)(36*1024)) 

修改為 ((size_t)(10*1024)) 即可,也就是 10K 字的大小:

//系統(tǒng)所有總的堆大小
#define configTOTAL_HEAP_SIZE					((size_t)(10*1024)) 

這樣,我們所有的修改就完成了,嘗試編譯吧!

后記

如果您覺得本文寫得不錯(cuò),可以點(diǎn)個(gè)贊激勵(lì)一下作者!
如果您發(fā)現(xiàn)本文的問題,歡迎在評(píng)論區(qū)或者私信共同探討!
共勉!文章來源地址http://www.zghlxwxcb.cn/news/detail-670756.html

到了這里,關(guān)于【學(xué)習(xí)日記】【FreeRTOS】FreeRTOS 移植到 STM32F103C8的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!

本文來自互聯(lián)網(wǎng)用戶投稿,該文觀點(diǎn)僅代表作者本人,不代表本站立場(chǎng)。本站僅提供信息存儲(chǔ)空間服務(wù),不擁有所有權(quán),不承擔(dān)相關(guān)法律責(zé)任。如若轉(zhuǎn)載,請(qǐng)注明出處: 如若內(nèi)容造成侵權(quán)/違法違規(guī)/事實(shí)不符,請(qǐng)點(diǎn)擊違法舉報(bào)進(jìn)行投訴反饋,一經(jīng)查實(shí),立即刪除!

領(lǐng)支付寶紅包贊助服務(wù)器費(fèi)用

相關(guān)文章

  • 全網(wǎng)最簡單的stm32f103c8t6移植ucosiii教程(附移植好的工程)

    全網(wǎng)最簡單的stm32f103c8t6移植ucosiii教程(附移植好的工程)

    ?? 最近在做一個(gè)機(jī)器人項(xiàng)目,需要使用到stm32f103c8t6核心板??紤]程序中的多任務(wù)特性,因此決定使用ucosiii用于多任務(wù)管理。ucosiii移植可能對(duì)于一些嵌入式老鳥來說,可能是信手拈來,但是對(duì)于很多新手特別是剛?cè)腴T的小白來說還是有一定的難度的。尤其是全網(wǎng)的移植教程

    2024年02月16日
    瀏覽(20)
  • 【U8G2庫移植到STM32F103C8T6上】

    【U8G2庫移植到STM32F103C8T6上】

    最近在B站上刷到了一位up主設(shè)計(jì)的oled絲滑界面WouoUI,一個(gè)優(yōu)雅得比較像話的UI框架,128 * 64 經(jīng)過詢問,得知up用的是U8G2庫,U8G2多用于arduino編譯器上,但是我們學(xué)校常用的是stm32。 所以經(jīng)過一段時(shí)間的研究,我將U8G2庫移植到了stm32f103c8t6上進(jìn)行使用。 關(guān)于U8G2的使用,可以參考

    2024年02月11日
    瀏覽(23)
  • 正點(diǎn)原子stmf103zet6代碼移植為stm32f103c8t6(庫函數(shù)版)

    目錄 1、打開正點(diǎn)原子的工程模板template, 點(diǎn)擊魔術(shù)棒 ?2、 修改芯片型號(hào) 為stm32f103c8

    2024年02月01日
    瀏覽(29)
  • STM32F103C8T6的學(xué)習(xí)(4)——外部中斷

    STM32F103C8T6的學(xué)習(xí)(4)——外部中斷

    :? 本教程基于up主江科大自化協(xié)——“STM32入門教程”記錄的個(gè)人學(xué)習(xí)筆記 跳轉(zhuǎn)鏈接: STM32入門教程-2022持續(xù)更新中_嗶哩嗶哩_bilibili ?中斷: 在主程序運(yùn)行過程中,出現(xiàn)了特定的中斷觸發(fā)條件(中斷源),使得CPU暫停當(dāng)前正在運(yùn)行的程序,轉(zhuǎn)而去處理中斷程序,處理完成后

    2024年02月02日
    瀏覽(22)
  • 初步了解STM32的學(xué)習(xí)筆記(以STM32F103C8T6為例)

    初步了解STM32的學(xué)習(xí)筆記(以STM32F103C8T6為例)

    ? STM32F103C8T6屬于主流系列STM32F1 內(nèi)核是ARM Cortex-Mex3 主頻為72Hz RAM:20K(SRAM) ROM:64K(Flash) 封裝:LQFP48 供電:2~3.6V(一般為3.3) (注意:以前51用的是5V,而USB也是5V,所以直接插上,而stm32會(huì)加上一個(gè)穩(wěn)壓芯片,讓電壓為3.3V) (所有圖都是用的是B站上整理過的) ?表里面

    2024年02月05日
    瀏覽(53)
  • 學(xué)習(xí)OSAL并移植到STM32F103開發(fā)板上

    學(xué)習(xí)OSAL并移植到STM32F103開發(fā)板上

    代碼參考出處:https://github.com/mcuwty/osal.git 我在此此基礎(chǔ)上做了整理,移植到了stm32f103上:demo鏈接: https://pan.baidu.com/s/1WoL8QCnicxO11hdeh4uh2Q 提取碼: wsn3 參考資料:?學(xué)習(xí)筆記(二)——BLE協(xié)議棧OSAL - 知乎 (zhihu.com) ? OSAL:即操作系統(tǒng)抽象層,它并不是一個(gè)傳統(tǒng)意義上的操作系統(tǒng)

    2024年03月26日
    瀏覽(59)
  • Stm32f103c8t6(proteus仿真)學(xué)習(xí)——3.按鍵控制LED燈

    Stm32f103c8t6(proteus仿真)學(xué)習(xí)——3.按鍵控制LED燈

    按鍵:button 電阻:res 先配置LED燈的GPIO 編寫LED亮滅的函數(shù) 實(shí)現(xiàn)按下按鍵LED燈的狀態(tài)取反 led.c總代碼 先配置按鍵的GPIO 獲取當(dāng)前按鍵鍵值的函數(shù) key.c總代碼 5.1 按鍵按下實(shí)現(xiàn)LED亮或者滅 仿真效果圖: 5.2 按鍵按下實(shí)現(xiàn)LED狀態(tài)取反 仿真效果圖: 百度網(wǎng)盤 鏈接:https://pan.baidu.co

    2024年02月07日
    瀏覽(22)
  • Stm32f103c8t6(proteus仿真)學(xué)習(xí)——1.點(diǎn)亮LED流水燈

    Stm32f103c8t6(proteus仿真)學(xué)習(xí)——1.點(diǎn)亮LED流水燈

    軟件準(zhǔn)備:keil uVsion 5 和 proteus 8.15 打開proteus8.15 - 新建項(xiàng)目 - 改名 - 一直next 鼠標(biāo)右鍵 - 放置 - 元件 - From Libraries 搜索Stm32 - 選擇stm32f103c8 畫出點(diǎn)亮一個(gè)LED燈的原理圖 提示,各元器件搜索: 主控芯片:stm32 電阻:res LED燈:led 鼠標(biāo)右鍵 - 放置 - 元件 - From Libraries 地和VCC 在左側(cè)

    2024年02月08日
    瀏覽(23)
  • stm32f103VET6和stm32f103c8t6有什么區(qū)別?

    stm32f103VET6和stm32f103c8t6有什么區(qū)別?

    我來終結(jié)下這個(gè)問題。 這兩款單片機(jī)我都用過,其中無際單片機(jī)特訓(xùn)營其中一款wifi報(bào)警主機(jī)項(xiàng)目就是用了stm32f103c8t6。 ?stm32f103VET6和stm32f103c8t6都是STMicroelectronics公司推出基于ARM Cortex-M3內(nèi)核的單片機(jī)。 它們?cè)谟布?guī)格和性能上存在一些差異,下面我詳細(xì)講解下它們的差異之處

    2024年02月15日
    瀏覽(102)
  • STM32f103c8t6小白學(xué)習(xí)筆記(一)從點(diǎn)燈開始之USB轉(zhuǎn)TTL

    STM32f103c8t6小白學(xué)習(xí)筆記(一)從點(diǎn)燈開始之USB轉(zhuǎn)TTL

    步驟一:與stm32f103c8t6最小系統(tǒng)板接線: ? ? ? 一共四根,PA9,PA10分別對(duì)應(yīng)連接RXD,TXD (如下圖),GND連GND ,3V3連32系統(tǒng)板的3.3V,跳線帽將5V和VCC相連(如上圖),原因 from數(shù)據(jù)手冊(cè) 步驟二:跳線帽:接法如上圖 BOOT0置1,BOOT1置0 ,原因from參考手冊(cè) ? ? ?因?yàn)槲沂褂玫氖谴谙螺d模

    2023年04月09日
    瀏覽(26)

覺得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請(qǐng)作者喝杯咖啡吧~博客贊助

支付寶掃一掃領(lǐng)取紅包,優(yōu)惠每天領(lǐng)

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包