UCOSII移植問題 IAR

2021-08-31 06:49:45 字數 1683 閱讀 3270

一、sprintf浮點數問題

最近遇到了乙個問題,就是ucosii中浮點數呼叫printf顯示不正常,但是裸機上對浮點數支援正常,以下是詳細情況。pragma data_alignment

在ucos中呼叫printf除錯浮點數的時候,在記憶體中表示正確,但是列印資料就都為0.00,其他整形資料表示正常。

定義了乙個float型別的變數i,在記憶體中的資料是這樣的,如下圖所示:

但是當呼叫printf列印的時候,會發現列印結果是這樣的:

在裸機上的執行結果是完全正常的,也就是說問題是出在ucos上。

經查資料得知,這是由於使用者任務堆疊沒有八字節對齊導致的,執行裸機程式時,系統的預設堆疊式八字節對齊的,但是ucos的使用者任務堆疊就不是這樣了。

將使用者堆疊八字節對齊即可。

解決方案:

1、iar下的解決方案:

通過#pragma data_alignment指定對齊位元組數

例如:

#pragma data_alignment=8

os_stk task1_led1_stk[task1_led1_stk_size];

#pragma data_alignment=8

os_stk task2_backlight_stk[task2_backlight_stk_size];

2、keil mdk下的解決方案:

在任務堆疊宣告前面加入強制八字節對齊命令,如下:

__align(8) static os_stk  taskequipmentstk[task_equipment_stk_size]; 		   	//任務堆疊

__align(8) static os_stk taskuartrcvstk[task_uartrcv_stk_size];

__align(8) static os_stk taskfilercvstk[task_filercv_stk_size];

__align(8) static os_stk taskftpstk[ task_ftp_stk_size ];

__align(8) static os_stk taskerrorraters485stk[ task_error_rate_rs485_stk_size ];

原因詳解

這事兒的歷史在於arm本身不支援非對齊資料訪問;因此在有了64bit的資料操作指令後,指令要求8位元組對齊。

進而,在編譯器的某個版本之後(rvct3?),aapcs就要求堆疊8位元組對齊。

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

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

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

二、功能比較

訊息佇列可以存放多個訊息,可以設定先進先出或者後進先出,但是需要控制好時序,因為不能像訊號量集一樣去濾波(識別)訊號。

郵箱進行傳遞單一資料,但是有指向性,可利用性好;

訊號量使用時,在累增,只能通過非0來進行動作;訊號量集則是通過16位資料的對應值來進行識別;

三、堆疊異常

盡量避免將空的指標資料進行迴圈;

移植UCOSII注意的問題

移植ucosii其實並不難,現在網上的資料又那麼多。但是要弄懂要花上不少時間。現在來說說移植需要注意的幾個問題吧。參考文件 pendsv 主要應用於系統任務切換 nvic 負責晶元的中斷管理 準備 micrium software ucos ii可以參考我上篇的建立工程,在上篇的工程結構基礎上我新建...

uCOS II 移植及遇到的問題

一 ucos 移植主要有三步 1.修改檔案 os cpu c.c ostasktkinit 函式是針對cpu壓棧的函式,需要模仿cpu初始化後的暫存器狀況。2.修改檔案os cpu.h 3.修改檔案os cpu a.asm 二 ucos移植中遇到的問題 1.任務不能進行有效切換 原因 以前任務只要t...

IAR移植FreeRTOS 筆記

2.新增原始碼到stm32工程3.修改工程 3.1工程下新建freertos目錄,新增原始碼中的7個.檔案和freertos portable menmang heap 4.c和freertos portable iar arm cm3 port.c portasm.s 3.2工程中新增標頭檔案 3...