提示:文章
文章目錄
- 前言
- 一、背景
- 第6章節
- 二、
- 2.1
- 2.2
- 三、
- 3.1
- 總結
前言
前期疑問:
本文目標:
一、背景
在家里先使用野火網盤資料里的freeRTOS源碼,網盤里是v9.0.0。
J:\野火\STM32F103ZET6_霸道開發板\A盤(資料盤)\1-程序源碼_教程文檔\3-[野火]《FreeRTOS內核實現與應用開發實戰指南》\2-FreeRTOS源碼及官方參考資料\ebf_freertos_data_20211225\FreeRTOSv9.0.0\FreeRTOSv9.0.0\FreeRTOS | ![]() | |
新建工程 | ![]() | |
1、 | ![]() | 本地創建文件夾 |
2、 | ![]() | 創建工程后選擇芯片 |
3、 | ![]() | 點擊OK,關閉Manage Run-Time Environment 選項框之后,剛剛我們選擇的CORE 和Startup 這兩個文件就會添加到我們的工程組里面 |
4、 | ![]() | 新建組并重命名并且在user文件夾和Doc文件夾中添加文件 |
5、 | ![]() | 按照教程main文件中新建demo代碼,編譯成功 |
6、 | ![]() | 根據system文件中的時鐘頻率更改工程的頻率,改成25M。還聯想到protues仿真時頻率設置成72M會亂碼,是不是這個原因呢?看了USART代碼,syste文件中設置的宏也不是36M,而是24M或者72M |
第6章節
看野火freeRTOS的資料,看到第7章 任務的定義與任務切換的實現——7.6 main 函數章節,教程寫了初版最簡單的多線程demo,然后想自己也照著實現工程,然后回到第3章 初識FreeRTOS——3.3 FreeRTOS 資料獲取,準備通過鏈接(https://sourceforge.net/projects/freertos/files/FreeRTOS/)下載freeRTOS源碼,但是不確定下載哪個版本,本來想下載最新版本,想了下下載BDM同版本的吧。
看BDM100的代碼源碼,查看下述文件:
確定是V10.2.1,所以下載對應版本。
第6 章節
這個章節在前面新建的本地工程基礎上,在freertos文件夾下新建一個include文件夾,里面放list.h文件,同時freertos文件夾新建一個list.c文件。將兩個文件添加到freeRTOS/Source組中,其中list.h文件還需要在頭文件中設置。
我直接從野火現有工程中拷貝文件。進入freertos文件夾下,看到除了list文件還有其他很多文件,主要是include文件夾中有不少其他文件。
處理方法是只拷貝list文件,下面設置頭文件路徑。
添加后編譯正常。
下面將野火工程中main文件代碼拷貝到keil,中文會亂碼,設置keil以下兩個項目:
設置好后重新拷貝,中文不亂碼。
重新編譯后報錯
拷貝FreeRTOS.h文件到include文件夾下,編譯,報錯如下
按照錯誤再繼續添加文件,
FreeRTOSConfig.h
portable.h
添加文件后報錯
繼續添加這個文件portmacro.h,編譯通過
keil警告:
查了下是因為版本授權過期。
報這個警告
遇到“no previous extern declaration for non-static variable”錯誤通常意味著在代碼中使用了某個變量,但是在使用它之前沒有正確地聲明或者定義該變量。
嘗試將頭文件全部添加到freertos組中,該告警繼續存在。忽略,仿真調試,在for語句處打斷點,將List_Item、List_Item1、List_Item2、List_Item3添加到watch窗口,全速運行查看實驗結果:
可以看到四個變量中存儲的前后節點情況。
所以這個章節應該就是嘗試寫了個關于freertos常用的鏈表的demo程序,為什么freertos常用鏈表呢。據我了解,任務有四個狀態:就緒態,運行態,阻塞態,()。其中就緒態,任務處于就緒態的時候,就是將任務放在就緒列表中。就緒列表就是一個鏈表,里面存了很多任務。
繼續往下看。
第7章
按照第7章教程,將第7章工程main文件代碼拷貝到自己的工程main文件中,編譯報錯,
拷貝task.h和task.c文件。
第7章用到了程序塊,按照教程在FreeRTOS.h文件中增加skTCB結構體定義。
FreeRTOS.h文件差異如下
拷貝后configMAX_TASK_NAME_LEN宏定義報錯,查看FreeRTOSConfig.h文件差異如下
編譯報錯缺少文件,拷貝文件
該文件中內容如下:
拷貝文件后編譯。
編譯報錯,根據錯誤搜索,發現portable.h文件也有差異如下
最終指向涉及到這個文件,這個文件是第7章新增的文件,路徑如下圖所示
添加文件后編譯,port.c文件報錯很多錯誤。如下圖所示
這個問題比較奇怪,之前沒有遇到過,最后查了資料,看到下面這篇文章得到答案:Keil5.37版本下,使用ARMcomplier6編譯__asm 函數報錯的問題,解決辦法如下圖
切換成下面的版本。編譯之前的報錯消失了,僅剩下面的一個錯誤。
根據這個錯誤定位到portmacro.h文件有差異。修改后編譯通過。
嘗試虛擬調試,將flag1和flag2加入analysis,運行出現預期效果
二、
2.1
2.2
三、
3.1
總結
未完待續