貞光科技是廣芯微電子代理商和解決方案供應(yīng)商,,負(fù)責(zé)廣芯微電子的低功耗MCU芯片,,8位/32位微控制器芯片、無(wú)線射頻收發(fā)器芯片,,數(shù)字電源管理芯片和傳感與信號(hào)調(diào)理專用芯片等產(chǎn)品的銷售和技術(shù)服務(wù)。
1 FreeRTOS簡(jiǎn)介
FreeRTOS 是市場(chǎng)領(lǐng)先的面向微控制器和小型微處理器的實(shí)時(shí)操作系統(tǒng) (RTOS),,與世界領(lǐng)先的芯片公司合作開發(fā),。FreeRTOS 通過(guò) MIT 開源許可免費(fèi)分發(fā),包括一個(gè)內(nèi)核和一組不斷豐富的庫(kù),,適用于所有行業(yè)領(lǐng)域,。FreeRTOS 的構(gòu)建強(qiáng)調(diào)可靠性和易用性。FreeRTOS 的主要功能可以歸結(jié)為以下幾點(diǎn):
優(yōu)先級(jí)調(diào)度,、相同優(yōu)先級(jí)任務(wù)的輪轉(zhuǎn)調(diào)度,,同時(shí)可設(shè)成可剝奪內(nèi)核或不可剝奪內(nèi)核
任務(wù)可選擇是否共享堆棧(co-routines & tasks),并且沒有任務(wù)數(shù)限制
消息隊(duì)列,,二值信號(hào)量,,計(jì)數(shù)信號(hào)量,遞歸互斥體
時(shí)間管理
內(nèi)存管理
1.1 FreeRTOS特點(diǎn):
FreeRTOS的特點(diǎn):
小型節(jié)能內(nèi)核 大小可擴(kuò)展,,可用程序內(nèi)存占用低至 6KB,。一些架構(gòu)包括無(wú)滴答的節(jié)能模式;
支持 40 多種架構(gòu) 代碼庫(kù)支持 40 多種 MCU 架構(gòu)和15 多種工具鏈,,包括最新的 RISC-V 和 ARMv8-M (Arm Cortex-M33) 微控制器,;
模塊化庫(kù) 越來(lái)越多的加載項(xiàng)庫(kù),適用于所有行業(yè)領(lǐng)域,,包括安全的本地或云連接,;
AWS參考集成 利用經(jīng)過(guò)測(cè)試的示例,其中包括安全連接到云所必需的所有庫(kù),;
MIT許可,,有選項(xiàng) FreeRTOS 可根據(jù) MIT 許可用于任何目的,。提供 商業(yè)許可,以及 安全認(rèn)證,。
2 RISC V簡(jiǎn)介
RISC-V是加州大學(xué)伯克利分校(University of California at Berkeley)設(shè)計(jì)并發(fā)布的一種開源指令集架構(gòu),,其目標(biāo)是成為指令集架構(gòu)領(lǐng)域的Linux,應(yīng)用覆蓋IoT(Internet of Things)設(shè)備,、桌面計(jì)算機(jī),、高性能計(jì)算機(jī)等眾多領(lǐng)域。
RISC-V讀作RISC Five,,意思是第五代精簡(jiǎn)指令處理器,。取這個(gè)名字只是因?yàn)槊绹?guó)伯克利研究團(tuán)隊(duì)的David Patterson教授在此之前已經(jīng)研制了四代精簡(jiǎn)指令處理器芯片。
RISC-V是由UC-Berkeley團(tuán)隊(duì)在歷代RISC架構(gòu)基礎(chǔ)上,,總結(jié)多個(gè)ISA 優(yōu)缺點(diǎn)而重新創(chuàng)建的一種新式ISA,, 它采取“開源”的模式對(duì)全世界開放,希望成為一切計(jì)算設(shè)備都可以采用的指令集架構(gòu),。它的開放性允許它可以自由地被用于任何目的,,允許任何人設(shè)計(jì)、制造和銷售基于RISC-V的芯片或軟件,,這種徹底的開放性在處理器領(lǐng)域還是第一次,。
2.1 RISC-V的特點(diǎn)
首先是開源的優(yōu)勢(shì):
任何公司和個(gè)人不需任何費(fèi)用就可以自由使用RISC-V,不像ARM指令集需要支付高昂授權(quán)費(fèi),,也不像英特爾不開放內(nèi)核,,只允許用戶基于微處理器進(jìn)行應(yīng)用開發(fā)。
RISC-V的開源會(huì)大大降低指令集修改和定制的門檻,,在實(shí)現(xiàn)芯片差異化設(shè)計(jì)的同時(shí)降低成本,,對(duì)發(fā)展自主可控處理器、擺脫壟斷有著十分重要的意義,。
其次是功能優(yōu)勢(shì):
RISC-V架構(gòu)的篇幅很短,,不用背負(fù)向后兼容的歷史包袱;
模塊化的靈活設(shè)計(jì),,RISC-V可根據(jù)特定應(yīng)用場(chǎng)景對(duì)指令集進(jìn)行裁剪或修改,;
RISC-V支持可擴(kuò)展定制指令;
RISC-V硬件設(shè)計(jì)與編譯器實(shí)現(xiàn)起來(lái)非常簡(jiǎn)單,。
3 基于FreeRTOS & RISC V內(nèi)核的PD協(xié)議的應(yīng)用
3.1 UM3506 PD SoC
廣芯微旗下雙向PD快充控制器芯片 UM3506 (TID: 2465), 采用軟硬結(jié)合的靈活可編程架構(gòu),,全面支持PD3.1 SRC, SNK, 雙向DRP和 EMARK功能,其中包括SPR下的PPS和ERP下的AVS動(dòng)態(tài)電壓模式,,同時(shí)還可支持EPR線纜中PD 3.1 EMARK模式,。
UM3506芯片采用TCPM/TCPC分層架構(gòu),集成原生的TCPC-like前端模塊,,包括用于Type-C接口檢測(cè)與控制的數(shù)字邏輯和模擬電路,,PD PHY層的分組BMC編解碼以及PD協(xié)議層中對(duì)時(shí)序有嚴(yán)格要求的關(guān)鍵功能,,同時(shí)創(chuàng)新地集成了基于RISC-V 指令集的32位微處理器內(nèi)核,大容量FLASH閃存/SRAM存儲(chǔ)器,、增強(qiáng)的外設(shè)接口和豐富的系統(tǒng)資源,。
3.2 應(yīng)用案例
USB PD EMARK數(shù)顯線,自帶0.96寸液晶屏幕,,在內(nèi)置EMARK功能從而支持100W功率傳輸?shù)耐瑫r(shí),,還可通過(guò)屏幕顯示電壓電流等參數(shù),實(shí)時(shí)了解設(shè)備用電信息,。通過(guò)內(nèi)置16通道12位ADC配合采樣電阻采集電流信息,并采集母線電壓信息,。
項(xiàng)目使用FreeRTOS, FreeRTOS 的實(shí)現(xiàn)主要由 list.c,、queue.c、croutine.c 和 tasks.c 4 個(gè)文件組成,。list.c 是一個(gè)鏈表的實(shí)現(xiàn),,主要供給內(nèi)核調(diào)度器使用;queue.c 是一個(gè)隊(duì)列的實(shí)現(xiàn),,支持中斷環(huán)境和信號(hào)量控制,;croutine.c 和 task.c 是兩種任務(wù)的組織實(shí)現(xiàn)。協(xié)程(英文為 croutine)是采用各任務(wù)共享同一個(gè)堆棧,, 使 RAM 的需求進(jìn)一步縮小,,但也正因如此,他的使用受到相對(duì)嚴(yán)格的限制,。而 task 則是傳統(tǒng)的實(shí) 現(xiàn),,各任務(wù)使用各自的堆棧,支持完全的搶占式調(diào)度,。
3.2.1 FreeRTOS移植
3.2.1.1 portmacro.h 頭文件
portmacro.h頭文件主要包括兩部分內(nèi)容,。第一部分定義了一系列內(nèi)核代碼中用到的數(shù)據(jù)類型,第二部分包含了實(shí)現(xiàn) FreeRTOS 移植所需要定義的函數(shù),。包括與架構(gòu)相關(guān)的定義,、內(nèi)核調(diào)度、臨界區(qū)管理,、任務(wù)優(yōu)化等,。
1.?dāng)?shù)據(jù)類型定義
定義編譯器相關(guān)的各種數(shù)據(jù)類型。
#define portCHAR char
#define portFLOAT float
#define portDOUBLE double
#define portLONG long
#define portSHORT short
#define portSTACK_TYPE unsigned portLONG
#define portBASE_TYPE long
2.架構(gòu)相關(guān)的定義
定義與處理器或控制器架構(gòu)相關(guān)的宏定義,。
#define configUSE_16_BIT_TICKS 0 //處理器字長(zhǎng)為32 位
#define portSTACK_GROWTH -1 //定義堆棧的生長(zhǎng)方向逆向生長(zhǎng)
//定義心跳時(shí)鐘周期,,表示的是相鄰Tick間間隔多少ms
#define portTICK_RATE_MS((portTickType)1000/configTICK_RATE_HZ)
//訪問(wèn)SRAM的字節(jié)對(duì)齊
#define portBYTE_ALIGNMENT 8
3.內(nèi)核調(diào)度函數(shù)
/* 聲明該函數(shù)定義在其它文件中,實(shí)現(xiàn)強(qiáng)制上下文切換,,用在任務(wù)環(huán)境中調(diào)用 */
extern void vPortYieldFromISR( void );
#define portYIELD() vPortYieldFromISR()
/* 強(qiáng)制上下文切換,,在中斷處理環(huán)境中調(diào)用 */
#define portEND_SWITCHING_ISR(xSwitchRequired)if(xSwitchRequired)\
vPortYieldFromISR()
3.2.1.2 port.c 源文件
1.堆棧初始化
進(jìn)行堆棧的初始化,,使堆棧處于預(yù)知的確定狀態(tài)。下面是堆棧初始化的代碼實(shí)現(xiàn),。
StackType_t *pxPortInitialiseStack( StackType_t *pxTopOfStack, TaskFunction_t pxCode, void *pvParameters )
{
/* 計(jì)算存儲(chǔ)程序狀態(tài)寄存器xPSR的堆址,,用于MCU在進(jìn)入或退出中斷時(shí)恢復(fù)現(xiàn)場(chǎng)*/ register int *tp asm("x4");
pxTopOfStack--;
/* 程序狀態(tài)寄存器的值保存于堆棧中 */
*pxTopOfStack = (portSTACK_TYPE)pxCode;
pxTopOfStack -= 22;
*pxTopOfStack = (portSTACK_TYPE)pvParameters;
pxTopOfStack -= 6;
*pxTopOfStack = (portSTACK_TYPE)tp;
pxTopOfStack -= 3;
*pxTopOfStack = (portSTACK_TYPE)prvTaskExitError;
return pxTopOfStack;
}
2.啟動(dòng)任務(wù)調(diào)度
portBASE_TYPE xPortStartScheduler( void )
{
/* 讓任務(wù)切換中斷和心跳中斷位于最低的優(yōu)先級(jí),使更高優(yōu)先級(jí)可以搶占MCU */
*(portNVIC_SYSPRI2) |= portNVIC_PENDSV_PRI;
*(portNVIC_SYSPRI2) |= portNVIC_SYSTICK_PRI;
/* 啟動(dòng)定時(shí)器,,開始產(chǎn)生系統(tǒng)的心跳時(shí)鐘,,此處中斷已被關(guān)閉 */
prvSetupTimerInterrupt();
/* 初始化臨界區(qū)的嵌套的個(gè)數(shù),準(zhǔn)備啟動(dòng)第一個(gè)任務(wù) */
uxCriticalNesting = 0;
/* 啟動(dòng)第一個(gè)任務(wù) */
vPortStartFirstTask();
/* 執(zhí)行到vPortStartFirstTask函數(shù),,內(nèi)核已經(jīng)開始正常的調(diào)度 */
return 0;
}
FreeRTOS首先為剛創(chuàng)建的任務(wù)分配所需內(nèi)存,,若分配成功,則初始化任務(wù)名稱,、堆棧深度和任務(wù)優(yōu)先級(jí),,然后根據(jù)堆棧的增長(zhǎng)方向初始化任務(wù)控制塊的堆棧。接著,,F(xiàn)reeRTOS把當(dāng)前創(chuàng)建的任務(wù)加入到就緒任務(wù)鏈表,。當(dāng)進(jìn)行任務(wù)調(diào)度時(shí),調(diào)度算法首先實(shí)現(xiàn)優(yōu)先級(jí)調(diào)度,。系統(tǒng)按照優(yōu)先級(jí)從高到低的順序從就緒任務(wù)鏈數(shù)組中選擇當(dāng)前最高就緒優(yōu)先級(jí),,據(jù)此實(shí)現(xiàn)優(yōu)先級(jí)調(diào)度。若此優(yōu)先級(jí)下只有一個(gè)就緒任務(wù),,則該任務(wù)進(jìn)入運(yùn)行狀態(tài),,若此優(yōu)先級(jí)下有多個(gè)就緒任務(wù) 則需采用輪換調(diào)度算法實(shí)現(xiàn)多任務(wù)輪流執(zhí)行。
3.2.2 項(xiàng)目軟件實(shí)現(xiàn)
本項(xiàng)目采用Eclipse IDE,,系統(tǒng)上電之后,,系統(tǒng)進(jìn)行硬件和時(shí)鐘初始化,MCU和操作系統(tǒng)的工作方式和工作狀態(tài)進(jìn)入準(zhǔn)備階段,,除了空閑任務(wù),,還創(chuàng)建了三個(gè)任務(wù):
(1)vUSBPDTask應(yīng)用于處理PD協(xié)議,EMARK信息處理,,充電方向,,電壓、電流數(shù)據(jù)采集并計(jì)算功率,,耗電功率等數(shù)據(jù),,最高優(yōu)先級(jí);
(2)vUartRxTask串口數(shù)據(jù)接收任務(wù),,用于系統(tǒng)調(diào)試,,第二優(yōu)先級(jí);
(3)vSysLcdHandlerTask顯示任務(wù),,可以通過(guò)按鍵切換各個(gè)顯示界面,,為了在各個(gè)狀態(tài)下顯示界面不被打亂,,創(chuàng)建 了g_sys_lcd_info.bus_lock互斥信號(hào)量,顯示電壓,、電流,、功率、充電方向,、用電功率等信息,,第三優(yōu)先級(jí);
顯示任務(wù)執(zhí)行耗時(shí)最長(zhǎng),,vUSBPDTask需要快速響應(yīng),,可以搶占其他任務(wù)從而確保PD信息的及時(shí)響應(yīng)和處理,又不影響顯示屏幕的顯示效果,。
軟件流程圖如下:
產(chǎn)品效果如下圖:
本項(xiàng)目產(chǎn)品已經(jīng)批量生產(chǎn),,實(shí)現(xiàn)實(shí)時(shí)多任務(wù)操作的同時(shí)縮短開發(fā)周期,保證了產(chǎn)品實(shí)時(shí)處理EMARK信號(hào),、準(zhǔn)確快速采集電壓電流等信息,、顯示流暢,,廣受客戶歡迎,。
UM3506的DEMO軟件已經(jīng)做好了FreeRTOS的移植,客戶可以很方便地根據(jù)需求創(chuàng)建自己的任務(wù),,快速開發(fā)產(chǎn)品,。**26667778廣芯微電子UM3506 基于FreeRTOS & RISC-V的USB PD協(xié)議實(shí)現(xiàn)
更多信息可以來(lái)這里獲取==>>電子技術(shù)應(yīng)用-AET<<