備忘:移植ucos-III到stm32f103c8t6


  由於本人對linux系統內核這塊比較感興趣,下一份工作想做linux驅動相關的;於是最近一旦有空都在研究linux內核源碼,面對linux內核這個龐然大物,越看越覺得不能太過急躁,且由於還要工作,只能在業余時間看看,所以不能貪多,只能挑自己感興趣的深入研究,其他的大概了解一下就行了;除此之外我還喜歡在真實的外設上測試學到的東西,作為電子信息專業的畢業生,理所當然地手頭有各種板子以及單片機~~~~,昨天在看stm32相關資料時看到野火的教程《uCOS-III 應用開發指南—基於 STM32F103系列》,試着移植ucos-iii到stm32上,整個過程還算比較順利的,但遇到了一個比較典型的問題,在此分享出來,作為備忘,也希望能夠幫到類似問題的人。

一、先來說說背景知識:

  STM32F103C8T6這塊芯片做成的最小系統板在某寶應該是最多的了,價格比51最小系統板便宜,當然片上資源更加豐富;

  這塊芯片有64K程序存儲器、20KSRAM;

  這塊芯片目前能跑的RTOS估計只有ucos(包括二代和三代)、RTOS;

 

二、ucos移植過程:

  包括從ucos官網下載相關源碼以及下載CM3相關源碼、安裝keil、創建工程等過程在此不做敘述,具體可以自行問谷歌或度娘;ucos-iii的移植可以參考《uCOS-III 應用開發指南—基於 STM32F103系列》,個人覺得寫的很不錯。

  那么問題來了:

    ----------------------分隔符---------------------------------------

linking...
.\Objects\ucos-led.axf: Error: L6406E: No space in execution regions with .ANY selector matching lib_mem.o(.bss).
.\Objects\ucos-led.axf: Error: L6406E: No space in execution regions with .ANY selector matching os_cfg_app.o(.bss).
.\Objects\ucos-led.axf: Error: L6406E: No space in execution regions with .ANY selector matching os_var.o(.bss).
.\Objects\ucos-led.axf: Error: L6406E: No space in execution regions with .ANY selector matching startup_stm32f10x_hd.o(STACK).
.\Objects\ucos-led.axf: Error: L6406E: No space in execution regions with .ANY selector matching app.o(.bss).
.\Objects\ucos-led.axf: Error: L6406E: No space in execution regions with .ANY selector matching os_var.o(.data).
.\Objects\ucos-led.axf: Error: L6406E: No space in execution regions with .ANY selector matching cpu_core.o(.data).
.\Objects\ucos-led.axf: Error: L6406E: No space in execution regions with .ANY selector matching stm32f10x_rcc.o(.data).
.\Objects\ucos-led.axf: Error: L6406E: No space in execution regions with .ANY selector matching cpu_core.o(.bss).
.\Objects\ucos-led.axf: Error: L6406E: No space in execution regions with .ANY selector matching lib_mem.o(.data).
.\Objects\ucos-led.axf: Error: L6406E: No space in execution regions with .ANY selector matching os_prio.o(.data).
.\Objects\ucos-led.axf: Error: L6406E: No space in execution regions with .ANY selector matching os_cpu_c.o(.data).
.\Objects\ucos-led.axf: Error: L6407E: Sections of aggregate size 0x8e30 bytes could not fit into .ANY selector(s).
Not enough information to list image symbols.
Not enough information to list the image map.
Finished: 2 information, 0 warning and 13 error messages.
".\Objects\ucos-led.axf" - 13 Error(s), 0 Warning(s).

----------------------分隔符---------------------------------------

  一下子這么多錯誤,看得我懵了,講道理按照教程一步一步來的,不應該出錯啊,當然書中所提及芯片和我自己用的還是有差別的,於是在這過程中我做了相應修改,書中所用是大容量的,我用的姑且算作中等容量;於是我搜索了相關問題,找到一種解決方案,具體為修改keil中存儲器大小配置;為什么要這樣改這個呢?原因是帶ucos的工程編譯后需要0x8e30 bytes(36k的樣子)的空間,而c8t6卻只有20K。

這是C8T6真實存儲器大小:

當然,這種方案可以讓程序編譯通過,不過並沒什么用,根本問題沒有解決;我從別處得到印證,ucos可以運行在RAM-8K以上的單片機中,於是我從代碼中找原因,最終我在一個頭文件中找到這么一行代碼:

//lib_cfg.h

  #define LIB_MEM_CFG_HEAP_SIZE 27u * 1024u /* Configure heap memory size [see Note #2a]. */  

  你沒有看錯,這里把堆空間設置為27K。。。。堆空間都比RAM還大了,這程序怎么可能在單片機是正常運行,於是我把堆空格改為10K,程序編譯通過,下載到單片機上,看到LED閃起來。。。證明本次ucos移植完成,之后可以通過STM32來驗證ucos的各種理論技術了。

  #define  LIB_MEM_CFG_HEAP_SIZE          10u * 1024u 

三、結語:

學習過程中遇到問題在所難免,但能解決問題的能力才是真正需要掌握東西,解決問題要建立在真實的外設上更有意義。

后續會分享一些ucos、RTOS、linux操作系統相關的積累和感悟。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM