UCOS學習問題(第一步)

2021-06-29 10:49:52 字數 2066 閱讀 7012

ucos系統使用

問題1:printf列印浮點型資料問題

在不使用ucos系統的時候,pirntf和以很正常的列印整型,短整型,浮點型類的資料,但是在使用ucos系統之後,printf列印整型和短整型資料還是沒有問題的,但是列印浮點型資料的時候就會出現很嚴重的問題,亂碼。經過分析與資料查詢,得知,硬體堆疊的資料對齊方式是8位的,但是如果使用ucos的話,每個任務都有自己的任務堆疊,這些堆疊的對齊方式可不是8位的,但是printf讀取浮點型資料的時候是以8位對齊的方式來讀取的,因此在列印ucos系統下的浮點型資料的時候機會出現嚴重的亂碼問題。

以下實在網路上收集的資料,以及解決的辦法:

1.問題描述:

當使用uocsprintf(),sprintf()列印浮點數問題會出問題,但是裸機不會出問題

我現在使用stm32跑ucos,在使用sprintf列印float型別時候,不管是何值最後都是0.0,但是型別是int,short型別時沒有問題。網上查到是任務堆疊8位元組對齊就可以了。

當沒有作業系統時,系統堆疊是8位元組對齊的,但是當使用ucos時,使用者任務不一定是8位元組對齊.

task1-led1

中的堆疊起始指標0x200004a4,不是8位元組對齊,所以但在task-led1任務中呼叫printf等系列函式就會出現問題.

2.解決方法

我用的是iar,通過#pragma data_alignment指定對齊位元組數

#pragmadata_alignment=8

os_stk task1_led1_stk[task1_led1_stk_size];

#pragmadata_alignment=8

os_stktask2_backlight_stk[task2_backlight_stk_size];

3.8

位元組對齊原因

這事兒的歷史在於arm本身不支援非對齊資料訪問;因此在有了64bit的資料操作指令後,指令要求8位元組對齊。進而,在編譯器的某個版本之後(rvct3?),aapcs就要求堆疊8位元組對齊。

是先有8位元組對齊的aapcs,然後才有的cm3。先後順序要注意。cm3 r2p0之前,自動壓棧也不要求8對齊,r2p0好像才是強制對齊的。

printf

的8對齊是c執行庫要求的,和硬體無關,c rtl手冊有寫,可以去閱讀。其根源在於aapcs要求;而aapcs根源在於ldrd這類指令。

換句話,未來如果128bit資料操作有了,arm還不支援非對其,那aapcs可能公升級為16位元組對齊。

供參考,cm3和c-rtl對齊的問題。

問題2:include.h  和 uc_global.h檔案問題

該問題我已經在原子的論壇上發表了一次,有個人自己的分析

問題3:記憶體塊定義不當導致迴圈中斷錯誤(有網上資料得知迴圈中斷錯誤一般是由陣列等的溢位導致的)

當時的情況;

這裡是建立了乙個記憶體管理建立函式,但是這個在編譯的時候雖然是沒有說明錯誤,然而在使用的時候直接就會到至程式執行到中斷死迴圈。導致這個的原因網上說是陣列一類的東西溢位,我查詢了半天還是沒有結果,建立記憶體塊是要給訊息佇列使用的,因此我最後找到了記憶體塊的身上,之後我進行了這樣的修改:

只是將陣列的建立從函式的內部放到了函式的外部,經過分析我大概的知道是這麼個回事。我門都知道,在函式內部建立的變數陣列等等,在其所在的函式執行完畢之後它們所占有的記憶體就會被釋放掉,然而,我門要建立記憶體塊就是希望不要釋放而是一直使用,因此,當我門呼叫獲取乙個儲存塊使用的時候就會導致錯誤,因為我門申請的內存在這個函式執行完畢之後已經釋放掉了,因此我門要將陣列建立在函式的外部,這樣這個記憶體區域就不會內釋放掉了。

學習第一步

開始 系統 命令提示符 win r鍵 輸入cmd開啟控制台 碟符切換 檢視當前目錄下的所有檔案 dir 切換目錄 cd change directory 跨碟符 cd d cd.清理螢幕 cls clear screen 退出終端 exit 檢視電腦的ip ipconfig 開啟應用 calc 計算...

學習計畫第一步

c 是靜態 強型別語言。而在很多情況下,提供 動態 行為,是常常發生的事情,例如通過反射在執行時訪問.net型別 呼叫 動態語言物件 訪問com物件等,都無法以靜態型別來獲取。因此,c 4.0引入的又乙個全新的關鍵字dynamic,也同時引入了改善靜態型別與動態物件的互動能力,這就是動態查詢 dyn...

Hibernate學習第一步

今天我在網上查的hibernate學習的基礎的第乙個簡單例子。實體類 如下 package domain public class news public void setuserid integer userid public string getusername public void setu...