在使用官方提供的FreeRTOS例程中,默認(rèn)是不使用F指令子集的。我在開啟了F指令子集后,并在“freertos_risc_v_chip_specific_extensions.h”文件中將宏ARCH_FPU修改為1后,無法進(jìn)行浮點(diǎn)數(shù)的計(jì)算。工程配置如下
測試程序如下:
打印的內(nèi)容如下:
但是不開F指令子集的話是可以正常打印計(jì)算的。請問是有什么操作不正確嗎
在使用官方提供的FreeRTOS例程中,默認(rèn)是不使用F指令子集的。我在開啟了F指令子集后,并在“freertos_risc_v_chip_specific_extensions.h”文件中將宏ARCH_FPU修改為1后,無法進(jìn)行浮點(diǎn)數(shù)的計(jì)算。工程配置如下
測試程序如下:
打印的內(nèi)容如下:
但是不開F指令子集的話是可以正常打印計(jì)算的。請問是有什么操作不正確嗎
您好,可以檢查一下操作系統(tǒng)中任務(wù)堆棧的對齊方式是否為8字節(jié)對齊,若不是,改為8字節(jié)對齊應(yīng)該可以解決問題。printf的C運(yùn)行庫要求8字節(jié)對齊,若沒有對齊導(dǎo)致發(fā)送浮點(diǎn)數(shù)失敗,因此操作操作系統(tǒng)需要對任務(wù)堆棧做出要求,需要進(jìn)行8字節(jié)對齊。FreeRTOS的字節(jié)對齊方式設(shè)置如下圖
此外需要注意下,當(dāng)需要打印浮點(diǎn)類型時(shí),MRS要進(jìn)行如下配置,具體如下圖:
您好,工程配置將下圖圈出部分也勾選上
你好,我已經(jīng)勾選上了該配置,但是仍然無法正常輸出。串口的輸出信息如下:
SystemClk:144000000 FreeRTOS?Kernel?Version:V10.4.6 task2?entry?1.200000 task1?entry?0.100000 task1?entry?0.000000 task2?entry?0.000000 task1?entry?0.000000 task1?entry?0.000000 task2?entry?0.000000 task1?entry?0.000000
可以看到,在第一次進(jìn)入task的時(shí)候是能正常計(jì)算出值的,但是后面經(jīng)過任務(wù)調(diào)度之后就變成0了。我猜測是否是任務(wù)調(diào)度器在切換任務(wù)的時(shí)候沒有把浮點(diǎn)CPU寄存器正常壓棧,即“freertos_risc_v_chip_specific_extensions.h”文件中的語句無法正常工作?
您好,附件為我的測試?yán)?,在我們EVT例程基礎(chǔ)上修改的,若配置沒問題,測試打印正常的,你可以看一下或直接用我的測試?yán)蹋蝿?wù)配置和你一樣的
你好,我使用了你的測試?yán)?,確實(shí)可以打印但是我發(fā)現(xiàn)“freertos_risc_v_chip_specific_extensions.h”中的ARCH_FPU宏沒有打開。該宏的用途是在任務(wù)切換時(shí)對FPU寄存器進(jìn)行壓棧和彈棧處理。
由于該宏沒有打開,導(dǎo)致了task1和task2互相使用了對方的計(jì)算結(jié)果,該現(xiàn)象在串口打印的數(shù)值中也可以看出:
SystemClk:144000000 FreeRTOS?Kernel?Version:V10.4.6 task2?entry,?b?=?1.200000 task1?entry,?a?=?0.100000 task1?entry,?a?=?0.200000 task2?entry,?b?=?0.300000 task1?entry,?a?=?0.400000 task1?entry,?a?=?0.500000 task2?entry,?b?=?0.600000 task1?entry,?a?=?0.700000 task1?entry,?a?=?0.800000 task2?entry,?b?=?0.900000 task1?entry,?a?=?1.000000 task1?entry,?a?=?1.100000 task2?entry,?b?=?1.200000
同樣,在第一次進(jìn)入task的時(shí)候正常打印了值a和b,分別是1.2和0.1。然而在進(jìn)行過一次任務(wù)切換后,b的值變成了0.3,這說明浮點(diǎn)寄存器沒有被壓棧,使用的值是之前計(jì)算a時(shí)調(diào)用FPU寄存器的值。
我找到問題了。貴公司提供的例程:http://www.findthetime.net/downloads/CH32V307EVT_ZIP.html? 中FreeRTOS的例程中使用的“freertos_risc_v_chip_specific_extensions.h”文件第106行至第133行,F(xiàn)PU寄存器全部從同一個(gè)棧地址彈棧,導(dǎo)致切換任務(wù)時(shí)恢復(fù)浮點(diǎn)寄存器現(xiàn)場出現(xiàn)錯(cuò)誤。
在你提供給我的這個(gè)工程中,該錯(cuò)誤是被修復(fù)的。
您好,感謝你的反饋,最新的EVT工程關(guān)于該問題已修改