開始之前明確一個東西裸機(jī)程序和RTOS程序的差別:參考下面三個連接瞅瞅
?
??????理解實(shí)時操作系統(tǒng)與裸機(jī)的區(qū)別-----Free RTOS 簡介_書中倦客的博客-CSDN博客_裸機(jī)操作系統(tǒng)
裸機(jī)與RTOS的理解和并發(fā)帶來的問題-電子發(fā)燒友網(wǎng) (elecfans.com)
??????類似于STM32之類的單片機(jī),RTOS比裸機(jī)真有那么大優(yōu)勢? (baidu.com)
總得來說呢,就是RTOS會損失部分DSP的運(yùn)算效率,建議還是開發(fā)裸機(jī)程序吧。
DSP_基于TMS320F28335和CCS7.2的編程入門_heqiunong的博客-CSDN博客
在上一篇關(guān)于DSP的文章中,我們講到了TMS320F28335芯片的編程入門,這款芯片是單核的,而本文涉及的TMS320F28377D是多核的。那么單核和多核編程直接是啥區(qū)別呢?對于TMS320F28377D,我感覺網(wǎng)上的資料不多,而且之前從來沒有多核編程的經(jīng)驗(yàn),回想當(dāng)初,我還是有些許的害怕的,其實(shí)掌握了還是很簡單的,下面記錄一下單核到多核的摸索之路。不要慌,循序漸進(jìn)即可。
1. 僅用28377D的CPU1實(shí)現(xiàn)“單核”+ 在線模式(RAM)
在線模式程序燒寫到RAM里運(yùn)行,CPU1和CPU2的啟停都受到仿真器的控制,斷電重啟后上次運(yùn)行的程序會丟失,需要重新燒寫。需要注意的重點(diǎn)是cmd文件要選對,因?yàn)槭菬龑懙絉AM,因此選擇2837xD_RAM_lnk_cpu1.cmd。另外由于我們用的是裸機(jī)程序而非RTOS,因此還需要選擇F2837xD_Headers_nonBIOS_cpu1.cmd。
DSP_基于TMS320F28335和CCS7.2的編程入門_heqiunong的博客-CSDN博客,前面我們講過建議去TI官網(wǎng)去下載controlSUITE軟件,所提及的cmd文件和各種源文件 庫文件這個軟件都能夠提供。
下面詳細(xì)介紹從打開CCS到把CPU1運(yùn)行起來。 (warning:大量無情截圖,毫無感情可言)
?
|
|
|
|
?
?
?
?
/*
* main.c
*
* Created on: 2021年11月16日
* Author: Heqiunong
*/
#include "F28x_Project.h"
void main(void)
{
InitSysCtrl();
DINT;
InitPieCtrl();
IER = 0x0000;
IFR = 0x0000;
InitPieVectTable();
EALLOW;
GpioCtrlRegs.GPDPUD.bit.GPIO111 = 0;
GpioCtrlRegs.GPDMUX1.bit.GPIO111 = 0; // GPIO111 = GPIO111
GpioCtrlRegs.GPDDIR.bit.GPIO111 = 1; // GPIO111 = output
EDIS;
while(1){
GpioDataRegs.GPDSET.bit.GPIO111 = 1;
DELAY_US(1000000);
GpioDataRegs.GPDCLEAR.bit.GPIO111 = 1;
DELAY_US(1000000);
}
}
?
?
?
?
?
?2. 僅用28377D的CPU1實(shí)現(xiàn)“單核”+ 離線模式(FLASH)
?離線模式指用把程序燒寫到Flash里運(yùn)行,斷電重啟后,程序仍可正常運(yùn)行。在線模式下,CPU1和CPU2的啟動和停止都受仿真器控制。離線模式下,CPU2的啟動受CPU1控制。
首先,代碼需要做一個拷貝 memcpy。【注意:以下操作有效的前提是代碼框架是按第一步那樣搭建的】
其次,cmd文件需要換一個
?編譯上傳后,斷電,把仿真器拔掉,再上電。 程序依然正常運(yùn)行,可以改變呼吸燈的頻率簡單驗(yàn)證程序是否離線運(yùn)行正常。
3. CPU1 + CPU2 實(shí)現(xiàn)“雙核”+ 在線模式(RAM)
為了驗(yàn)證雙核的程序,基于雙核實(shí)現(xiàn)不同頻率的呼吸燈。TMS320F28377D的雙核CPU1和CPU2,是近乎可視為各自獨(dú)立的,從某種程度上,你可以把它視為兩塊單核的dsp來用。如果想要跑雙核的程序,需要給CPU1和CPU2分別建一個工程。
3.1 CPU1和CPU2分別各建一個工程
首先需要說明的是CPU1和CPU2都需要設(shè)置一個 Predefined Symbols, CPU1就設(shè)置個CPU1,CPU2就設(shè)置個CPU2。 前文我們是在源文件里面#define CPU1。現(xiàn)在是我們換了一種更official的方法。
?
3.2 CPU1CPU2雖近乎獨(dú)立,但它們應(yīng)是主從關(guān)系
3.2.1 比如CPU2是無法配置GPIO的,它只能CPU1來配置
下面是CPU2的代碼,里面嘗試配置GPIO的上拉,復(fù)用和輸出方向
?
??
因此GPIO的配置,則必須放在CPU1的工程里面。 我們的程序配置只需要配置兩個連LED燈的GPIO MUX功能為GPIO,方向配置成輸出。
3.2.2 另外還有一個證據(jù)說明CPU1 CPU2是主從關(guān)系
CPU1能夠使用官方提供的所有source文件,而CPU2卻有部分source文件是不支持的。如下圖所示。
?把圖中出現(xiàn)問題,帶有小紅×的.c源文件刪除,CPU2的工程即可正常編譯。
3.3CMD文件的選擇
CPU1工程 |
CPU2工程 |
3.4 仿真時,工程啟動順序(很關(guān)鍵)?
首先用CPU1的工程來連接,并且把CPU1和CPU2兩個都勾選上。 這特別關(guān)鍵,必須選對,它只給你選一次的機(jī)會,后面就不讓你選了。我真的找了好久的接口,會的朋友可以教教我
然后,就會出現(xiàn)下圖的情況
我們發(fā)現(xiàn), 此時CPU2上目前加載的是CPU1工程的代碼,因此我們需要替換成CPU2本身的代碼,所以需要重新load。
?
好,現(xiàn)在CPU1是跑的是CPU1工程的程序,CPU2跑的CPU2程序。 現(xiàn)在還需要注意的是 先跑CPU1的程序,再跑CPU2的程序。
?
?這樣,就是雙核在線模式的主要流程了
另外還有一個段代碼需要注意
GPIO_SetupPinMux(111, GPIO_MUX_CPU2, 0);
這句話的意思應(yīng)該是說,CPIO111復(fù)用給CPU2,里面各種指針滿天飛,主要是設(shè)置偏移地址。
沒這句話, CPU2里面對GPIO置位和清零操作是不起作用的。
4. CPU1 + CPU2 實(shí)現(xiàn)“雙核”+ 離線模式(FLASH)
代碼還是用雙核在線模式的代碼為基礎(chǔ),主要看一下怎么燒寫到FLASH里面。
4.1 CMD文件的選擇
CPU1工程的CMD |
CPU2工程的CMD |
4.2 代碼需要注意的地方
CPU1工程添加兩個預(yù)定義宏, CPU2工程需要添加一個預(yù)定義宏
?
?強(qiáng)烈建議用上述方式去配置。
為什么呢? 因?yàn)槟阒苯釉趍ain.c里面配置的話,包含InitSysCtrl的這個文件找不到_FLASH這個宏。
?這個灰色的塊,意思就是_FLASH沒有被定義。
我嘗試寫一個main.h文件,把宏定義放在那里面。同時,Include Options把main.h的路徑添加進(jìn)去,但是還是找不到。
但在F2837xD_SysCtrl.c文件里面#include "main.h"就可以,后面再酌情優(yōu)化一下吧。
以下是關(guān)鍵代碼:
CPU1里的
#include "F2837xD_Ipc_drivers.h"
#ifdef _STANDALONE
#ifdef _FLASH
//
// Send boot command to allow the CPU02 application to begin execution
//
IPCBootCPU2(C1C2_BROM_BOOTMODE_BOOT_FROM_FLASH); 這行會被執(zhí)行
#else
//
// Send boot command to allow the CPU02 application to begin execution
//
IPCBootCPU2(C1C2_BROM_BOOTMODE_BOOT_FROM_RAM);
#endif
#endif
CPU2工程里的
#ifdef _FLASH
memcpy(&RamfuncsRunStart, &RamfuncsLoadStart, (size_t)&RamfuncsLoadSize);
InitFlash();
#endif
燒寫和在線模式一樣, CPU1工程啟動綠色小爬蟲, 然后再把CPU2的程序換成已編譯好的CPU2工程的.out文件。
值得注意的是,這種模式無法在線調(diào)試,加斷點(diǎn)什么的。 拔掉仿真器,然后斷電重啟,就可以正常跑起來了。文章來源:http://www.zghlxwxcb.cn/news/detail-640477.html
那如果要在線調(diào)試呢? 可以把_STANDALONE的預(yù)定義去掉,就可以了。文章來源地址http://www.zghlxwxcb.cn/news/detail-640477.html
到了這里,關(guān)于DSP_基于TMS320F28377D雙核芯片和CCS7.40的編程入門的文章就介紹完了。如果您還想了解更多內(nèi)容,請?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!