數(shù)字電源技術(shù)在這幾年可以說是炙手可熱,而其控制器通常使用由TI設(shè)計(jì)的C2000芯片。不過絕大多數(shù)電力電子的同學(xué)一定是對(duì)這款MCU又愛又恨,愛的是其強(qiáng)大的處理性能在電力電子控制領(lǐng)域簡(jiǎn)直是游刃有余,具體可以參考下文。恨的是在C2000平臺(tái)上開發(fā)比較復(fù)雜的電力電子系統(tǒng)時(shí)非常費(fèi)時(shí)費(fèi)力,經(jīng)常是寫算法十分鐘,查datasheet兩小時(shí),好不容易run起來了還要解BUG兩小時(shí),相信小伙伴們一定有類似的感受。這篇文章就來探討為什么會(huì)出現(xiàn)這樣的問題以及如何解決,希望能解決各位同仁遇到的痛點(diǎn)問題~,相信小伙伴們一定有類似的感受。這篇文章就來探討為什么會(huì)出現(xiàn)這樣的問題以及如何解決,希望能解決各位同仁遇到的痛點(diǎn)問題~
數(shù)字電源為什么一般用DSP控制,而不能用普通的單片機(jī)?
裸機(jī)開發(fā)實(shí)在是太慢
針對(duì)裸機(jī)與實(shí)時(shí)操作系統(tǒng)的對(duì)比討論已經(jīng)很多,而搞電力電子的小伙伴可能不是很熟,所以這里針對(duì)電源開發(fā)應(yīng)用再單獨(dú)討論討論。對(duì)于一些簡(jiǎn)單的電源應(yīng)用,往往只需要一個(gè)while大循環(huán)再加上中斷就能完成。但是隨著產(chǎn)品的不斷升級(jí)和功能復(fù)雜化,一個(gè)這種“傳統(tǒng)”的開發(fā)裸機(jī)已經(jīng)逐漸變得愈發(fā)臃腫,往往我們會(huì)遇到的主要難點(diǎn)是,開發(fā)速度非常慢!非常慢!非常慢!其中的原因我想可以展開為以下幾點(diǎn): 一是學(xué)習(xí)曲線非常陡峭。TI的硬件封裝api做得并不好,這就導(dǎo)致C2000平臺(tái)上出現(xiàn)大部分用戶寫代碼都是直接操作寄存器的奇觀,雖說直接操作寄存器顯得很高級(jí),代碼效率也會(huì)比較高,但是代價(jià)就是開發(fā)速度相當(dāng)慢。每次做不同的實(shí)驗(yàn)的時(shí)候都需要重新閱讀datasheet,查看每一個(gè)寄存器配置成什么值代表什么意思,等到寫好了再調(diào)試又會(huì)花非常多的時(shí)間,據(jù)我所知,由于C2000架構(gòu)的相對(duì)復(fù)雜性,僅僅是一個(gè)中斷的配置都能難倒不少人。stm32的封裝就做的很好,官方的HAL用起來用戶省心了不少,那么問題來了,TI什么時(shí)候能爭(zhēng)點(diǎn)氣呢? 二是重復(fù)造輪子的情況非常普遍。不同人對(duì)于不同功能都有自己的函數(shù)實(shí)現(xiàn),導(dǎo)致所有人的代碼互相不兼容,各自為陣。以我自己為例,我以前的開發(fā)流程是先配置寄存器,也就是導(dǎo)入一個(gè)看起來跟自己實(shí)現(xiàn)功能差不多的官方例程。每加一個(gè)新功能就導(dǎo)入一個(gè)例程,然后ctrl c ctrl v。寄存器配置完畢之后寫應(yīng)用層函數(shù),比如說為了實(shí)現(xiàn)串口控制,會(huì)寫串口字符的解析函數(shù)。我記得,串口的解析程序和發(fā)送程序我都寫了好多遍,個(gè)中酸爽,相信大家都有所體會(huì)。 三是可維護(hù)性是一個(gè)很大的問題。一般電力電子系統(tǒng)會(huì)對(duì)于環(huán)路計(jì)算的實(shí)時(shí)性要求非常高,所以會(huì)放在中斷中計(jì)算,然后其他任務(wù)放在大while中放一個(gè)狀態(tài)機(jī)判斷。一旦任務(wù)多了,任務(wù)之間的依賴錯(cuò)綜復(fù)雜。此時(shí)在while大循環(huán)中就出現(xiàn)非常復(fù)雜的狀態(tài)機(jī)系統(tǒng),此時(shí)系統(tǒng)的可維護(hù)性將會(huì)變得非常差,出現(xiàn)大家常說的屎山代碼,相信包括在我在內(nèi)的任何人都不愿意看別人寫的狀態(tài)機(jī)代碼。而且這么復(fù)雜的狀態(tài)機(jī)系統(tǒng)如果不經(jīng)過良好的時(shí)序優(yōu)化,系統(tǒng)的實(shí)時(shí)性其實(shí)也會(huì)變得非常糟糕。 四是內(nèi)存安全得不到有力保障。任何一個(gè)處理多個(gè)任務(wù)的系統(tǒng)都涉及不同任務(wù)對(duì)共享內(nèi)存的訪問,電力電子控制也不例外。比如有些狀態(tài)機(jī)可能被主循環(huán)和ISR同時(shí)讀寫,就可能產(chǎn)生所謂“競(jìng)爭(zhēng)”的問題。比如主循環(huán)正將狀態(tài)從A修改到B,這時(shí)ISR打斷主函數(shù)并將狀態(tài)從A修改到C并返回,然后主循環(huán)開始執(zhí)行狀態(tài)B對(duì)應(yīng)的代碼可是此時(shí)真正的狀態(tài)已經(jīng)是C了,最終導(dǎo)致狀態(tài)機(jī)崩潰。這種問題特別難以調(diào)試,一旦出問題就很嚴(yán)重,遇到了可能只能燒香拜佛了。同步和競(jìng)爭(zhēng)的概念可能對(duì)很多電力電子的小伙伴比較陌生,感興趣的同學(xué)可以參見:
如何告別以上這些痛苦呢?讓RTOS來拯救你。
實(shí)時(shí)操作系統(tǒng)
什么是實(shí)時(shí)操作系統(tǒng)
實(shí)時(shí)操作系統(tǒng)(Real-time operating system, RTOS),又稱即時(shí)操作系統(tǒng),它會(huì)按照排序運(yùn)行、管理系統(tǒng)資源,并為開發(fā)應(yīng)用程序提供一致的基礎(chǔ)。實(shí)時(shí)操作系統(tǒng)與一般的操作系統(tǒng)相比,最大的特色就是“實(shí)時(shí)性”,如果有一個(gè)任務(wù)需要執(zhí)行,實(shí)時(shí)操作系統(tǒng)會(huì)馬上(在較短時(shí)間內(nèi))執(zhí)行該任務(wù),不會(huì)有較長(zhǎng)的延時(shí)。
以上只是概念,大家可能看得似懂非懂,沒關(guān)系,咱們掰開了來看RTOS憑啥能解決前面提到的痛點(diǎn)問題?
開發(fā)速度快
操作系統(tǒng)是一個(gè)統(tǒng)一的平臺(tái),也就是下圖中的內(nèi)核部分,上層的組件層同樣重要。組件層對(duì)物理外設(shè)實(shí)現(xiàn)了硬件驅(qū)動(dòng)程序,并以API的形式暴露給上層應(yīng)用層。這樣的好處非常明顯。首先,用戶只需調(diào)用簡(jiǎn)單(可讀性好)的函數(shù)就能實(shí)現(xiàn)想要的功能,再也不用跟底層寄存器打交道了,極大地縮短了開發(fā)周期。其次,降低開發(fā)難度。系統(tǒng)可以幫程序員省去大量時(shí)間思考軟件架構(gòu),只要保證調(diào)度和執(zhí)行的完整性。甚至不需要特別處理,就可以做到很多事情。免去了,很多意外造成的跑飛。更重要的,統(tǒng)一的平臺(tái)架構(gòu)使得用戶之間的代碼可以共享,從此告別在造輪子這件事情上反復(fù)花時(shí)間的時(shí)代。試想,不久的將來,你可能可以在C2000上運(yùn)行python程序,這是不是很有意思!
保證系統(tǒng)實(shí)時(shí)性
實(shí)時(shí)操作系統(tǒng)天生就是給多任務(wù)設(shè)計(jì)的。對(duì)于復(fù)雜的電源系統(tǒng)也會(huì)涉及到多任務(wù)工作。比如各種系統(tǒng)狀態(tài)判斷,狀態(tài)監(jiān)控,與上位機(jī)或者是FPGA通訊的程序,又或者需要使用到人機(jī)交互的處理程序等等。這么多程序中可能還會(huì)涉及到大量需要延遲等待的情形,使得任務(wù)實(shí)現(xiàn)變得異常復(fù)雜且難調(diào)試。甚至可能需要復(fù)雜的狀態(tài)機(jī)設(shè)計(jì)才有可能完成,這對(duì)程序員的素質(zhì)要求還是非常高的。 而當(dāng)使用RTOS,效果就四個(gè)字,無腦操作。多個(gè)任務(wù)設(shè)定優(yōu)先級(jí),優(yōu)先級(jí)最高的優(yōu)先執(zhí)行,執(zhí)行完畢之后等待,調(diào)度器自動(dòng)切換到其他任務(wù)繼續(xù)執(zhí)行。并且調(diào)度器能夠?qū)⑷蝿?wù)切片并在不同任務(wù)之間進(jìn)行輪轉(zhuǎn),避免單一任務(wù)過分消耗系統(tǒng)資源,將任務(wù)均衡地分配到各個(gè)時(shí)間片中,使得整個(gè)系統(tǒng)的總體運(yùn)行效率最高。
保證內(nèi)存安全性
RTOS設(shè)計(jì)了一整套“同步機(jī)制”避免多個(gè)任務(wù)對(duì)內(nèi)存的“競(jìng)爭(zhēng)問題”,這些機(jī)制包括互斥鎖,旗語(yǔ),臨界區(qū)段等等,確保多個(gè)任務(wù)有序?qū)蚕韮?nèi)存進(jìn)行訪問。用戶只需要調(diào)用這些函數(shù)即可,完全不需要管其實(shí)現(xiàn)細(xì)節(jié),簡(jiǎn)單又好用,再也沒有莫名其妙程序跑飛的煩惱!
尷尬的現(xiàn)狀
說完這么多優(yōu)點(diǎn),但現(xiàn)狀卻是讓人非常尷尬。
缺乏基于C2000的靠譜好用的RTOS
RTOS在嵌入式領(lǐng)域發(fā)展的比較好,比如著名的freeRTOS,以及國(guó)內(nèi)自主開發(fā)的RT-Thread。但是由于搞嵌入式的人往往很少搞電力電子,這就導(dǎo)致嵌入式的操作系統(tǒng)很少有專門給C2000芯片做移植的,同時(shí)設(shè)計(jì)的時(shí)候也沒有考慮電力電子應(yīng)用的特殊性。目前有一些非官方的移植,但是功能有限,年久失修,開發(fā)者已經(jīng)跑路。有興趣的童鞋可以嘗試。
https://github.com/IvanZuy/freertos_c28x
缺乏針對(duì)C2000的定制化設(shè)備框架
在電力電子領(lǐng)域,外設(shè)硬件的操作有自身獨(dú)特的復(fù)雜性。比如PWM不可能僅僅滿足于配置周期、占空比這種常規(guī)配置。還需要相位、死區(qū)、影子裝載、外部ADC采樣觸發(fā)等等靈活配置,而這卻是目前主流RTOS所空缺的。
TI開發(fā)的RTOS
作為C2000的親媽,TI自然是老早就基于C2000實(shí)現(xiàn)了自己的一套R(shí)TOS,然而這套工具可謂是非常難用以至于到現(xiàn)在都沒有被市場(chǎng)所接受,主要原因是
1、系統(tǒng)開源但不開放。TI-RTOS的C代碼使用xdc格式進(jìn)行分裝。xdc格式閱讀代碼體驗(yàn)較差,比較反人類。首先部分源代碼不是直接提供而是通過xdc tool生成的,所以代碼的透明性很差。其次經(jīng)過xdc分裝的代碼很難追蹤,有些符號(hào)在代碼中的名字和鏈接之后的名字不一樣。這給代碼閱讀和調(diào)試造成了非常大的困難,簡(jiǎn)直無處著手。由此可見,TI-RTOS經(jīng)過xdc封裝之后,是一個(gè)開源但不開放的系統(tǒng),完全是被CCS控制的,用戶可以獲得源碼但是完全沒有辦法在OS層面進(jìn)行改動(dòng),只能在ti提供的api之上進(jìn)行改動(dòng)。 2、搶占功能有限。為保證實(shí)時(shí)性,RTOS通常是搶占(preempt)系統(tǒng),即任務(wù)是可以被打斷并在不同任務(wù)之間輪轉(zhuǎn)的。TI-RTOS缺少在中斷中對(duì)進(jìn)行線程上下文切換的機(jī)制,這意味著線程內(nèi)部必須有主動(dòng)掛起的操作才能搶占,否則將運(yùn)行到底,不具備真正意義上的多任務(wù)搶占的功能。這是TI-RTOS的一個(gè)硬傷。 3、維護(hù)非常非常差。因?yàn)橛脩粲邢?,TI-RTOS對(duì)C2000的支持和維護(hù)非常差。筆者在TMS32028379D平臺(tái)下測(cè)試了TI-RTOS的幾個(gè)例程,發(fā)現(xiàn)很多例程(比如swi和task)無法運(yùn)行直接跑飛。只有hello這一個(gè)例程可以正常運(yùn)行。可見TI-RTOS對(duì)C2000根本不像親兒子,簡(jiǎn)直就是撿來的孩子。
RT-Thread
RT-Thread誕生于2006年,是一款以開源、中立、社區(qū)化發(fā)展起來的物聯(lián)網(wǎng)操作系統(tǒng)。RT-Thread主要采用 C 語(yǔ)言編寫,淺顯易懂,且具有方便移植的特性(可快速移植到多種主流 MCU 及模組芯片上)。RT-Thread把面向?qū)ο蟮脑O(shè)計(jì)方法應(yīng)用到實(shí)時(shí)系統(tǒng)設(shè)計(jì)中,使得代碼風(fēng)格優(yōu)雅、架構(gòu)清晰、系統(tǒng)模塊化并且可裁剪性非常好。目前已經(jīng)做到通過wrapper兼容freertos和uC/OS,提供posix接口,同時(shí)兼容Arduino。在內(nèi)核層面提供各種hook方便用戶定制。 總之就是傻瓜操作,兼容并包,而且是中國(guó)創(chuàng)造?;诖宋覀冞x擇了基于RT-thread進(jìn)行開發(fā)適配于C2000的RTOS。
目前已實(shí)現(xiàn)的效果
兼容控制臺(tái)使用命令行控制
通過串口,我們可以實(shí)現(xiàn)類似命令行的工具,可以非常方便監(jiān)控系統(tǒng)狀態(tài)并且操縱外設(shè),啟動(dòng)任務(wù)
比如輸入如下指令就可以設(shè)置pwm占空比、相位、死區(qū)等等
pwm probe- probe pwm by name pwm enable - enable pwm channel pwm disable - disable pwm channel pwm get - get pwm channel info pwm set - set pwm channel info pwm phase - set pwm phase pwm dead_time - set pwm dead time
對(duì)硬件層做了充分的抽象
以GPIO為例,在此對(duì)比了傳統(tǒng)的寫寄存器的方式和采用封裝后的程序調(diào)用方式。
// 操作寄存器版本的代碼實(shí)現(xiàn) EALLOW; GpioCtrlRegs.GPAPUD.bit.GPIO0 = 0; // Enable pullup on GPIO0 GpioCtrlRegs.GPAMUX1.bit.GPIO0 = 0; GpioCtrlRegs.GPADIR.bit.GPIO0 = 1; GpioDataRegs.GPADAT.bit.GPIO0 = 1; EDIS; // 封裝之后的代碼實(shí)現(xiàn) #define LED0_PIN GET_PIN(A, 0) rt_pin_mode(LED0_PIN, PIN_MODE_OUTPUT); rt_pin_write(LED0_PIN, PIN_HIGH);
從可讀性來看,標(biāo)準(zhǔn)化的函數(shù)接口看起來一目了然。
再比如ePWM模塊,ePWM可謂是C2000的一大法寶,優(yōu)化設(shè)計(jì)的驅(qū)動(dòng)也將發(fā)揮ePWM的全部實(shí)力,為此,我們針對(duì)C2000平臺(tái)定制了專門的設(shè)備框架,可以靈活控制周期、占空比、相位、死區(qū)等等。比如設(shè)置pwm的周期和占空比可以通過如下代碼,代碼將變得清晰易讀,并且可以快速移植。
rt_device_control(&pwm1,PWM_CMD_SET_PERIOD, 10000);//設(shè)置周期為10us rt_device_control(&pwm1,PWM_CMD_SET_DUTY, 0.5);//設(shè)置占空比為50%
結(jié)合Kconfig實(shí)現(xiàn)高度靈活配置
也可以通過Kconfig(一種類似圖形界面的配置工具)來詳細(xì)配置每一個(gè)寄存器,此時(shí)每一個(gè)選項(xiàng)都是以文字說明,以交互式的方式直接提示給用戶,免去用戶查詢datasheet的痛苦,非常方便。
搶占式任務(wù)調(diào)度
我們用一種非常巧妙的機(jī)制在C2000中實(shí)現(xiàn)了在中斷環(huán)境下的上下文切換,實(shí)現(xiàn)了真正意義上的搶占式多任務(wù)調(diào)度,解決了TI-RTOS懸而未決的一個(gè)重大難題。
幾乎無開銷的中斷響應(yīng)
熟悉RTOS的小伙伴可能會(huì)覺得在電源系統(tǒng)這種實(shí)時(shí)性要求這么高的場(chǎng)合是否使用RTOS會(huì)影響系統(tǒng)中斷的延遲。這是由于RTOS的某些關(guān)鍵操作需要關(guān)閉全局中斷,這可能影響關(guān)鍵中斷的響應(yīng)速度。目前測(cè)試結(jié)果顯示rt-thread關(guān)閉全局中斷的時(shí)間最長(zhǎng)不超過1us(測(cè)試條件:5個(gè)線程,100Hz SYSTICK,CPU 200MHz,TMS320F28379),幾乎不會(huì)對(duì)關(guān)鍵中斷(比如PWM)響應(yīng)造成影響。后續(xù)我們會(huì)進(jìn)一步對(duì)內(nèi)核進(jìn)行改進(jìn),使得系統(tǒng)關(guān)鍵操作只關(guān)閉部分而非全局中斷,確保部分重要中斷可以獲得**0延遲(與裸機(jī)完全相同)**的響應(yīng)速度。所以這一點(diǎn)大家不必?fù)?dān)心,使用我們開發(fā)的系統(tǒng)可以做到幾乎或者是零延遲!
未來工作
目前已經(jīng)完成了內(nèi)核移植(針對(duì)C2000的特殊架構(gòu)定制化了部分內(nèi)核代碼),完成了GPIO、UART、ePWM驅(qū)動(dòng),未來在持續(xù)更新ADC、Timer等外設(shè)的驅(qū)動(dòng)。更進(jìn)一步,我們將會(huì)把RTOS進(jìn)程到Simulink的代碼生成工具里面,實(shí)現(xiàn)圖形化編程和一鍵代碼生成。與Simulink自帶的C2000支持包不同,我們的代碼生成工具基于RTOS的框架,生成的是人類可以閱讀和調(diào)試的代碼,從樣機(jī)到產(chǎn)品,代碼一步到位,無需手動(dòng)移植!我們還會(huì)針對(duì)C2000芯片移植各種自動(dòng)化工具,比如自動(dòng)生成cmd文件,自動(dòng)生成CCS工程文件,讓各種重復(fù)勞動(dòng)都成為歷史。
-
寄存器
+關(guān)注
關(guān)注
31文章
5336瀏覽量
120229 -
程序
+關(guān)注
關(guān)注
117文章
3785瀏覽量
81001 -
python
+關(guān)注
關(guān)注
56文章
4792瀏覽量
84627
原文標(biāo)題:讓實(shí)時(shí)操作系統(tǒng)助力電力電子系統(tǒng)設(shè)計(jì)
文章出處:【微信號(hào):RTThread,微信公眾號(hào):RTThread物聯(lián)網(wǎng)操作系統(tǒng)】歡迎添加關(guān)注!文章轉(zhuǎn)載請(qǐng)注明出處。
發(fā)布評(píng)論請(qǐng)先 登錄
相關(guān)推薦
評(píng)論