引言
随着嵌入式系统和数字信号处理(DSP)技术的快速发展,越来越多的应用需要更高的计算性能和更复杂的功能来满足实际需求。双核CPU,使得开发人员能够利用并行处理能力,大幅提升系统性能和效率。
DSP的双核架构不仅带来了显著的计算能力提升,还提供了更灵活的资源管理和任务分配能力。通过合理的内核分工和资源共享,开发人员可以在同一个芯片上实现更复杂的功能。例如,一个内核可以专注于实时控制算法的执行,而另一个内核可以处理通信和数据管理任务。这种并行处理能力对于需要高精度、高可靠性的应用,如电机控制、电力电子和工业自动化等领域,尤为重要。
然而,充分利用双核架构的优势并非易事。开发人员不仅需要理解基本的双核操作和通信机制,还必须掌握如何在两个内核之间高效地分配任务和资源。在实际应用中,合理的内存管理、任务调度和内核间通信(IPC)等都是成功实现双核应用的关键。
本书旨在详细介绍如何创建DSP双核工程、编写DSP双核程序、设置双核配置到烧录双核固件,最终实现DSP双核程序的运行。
准备
- Code Composer Studio 集成式开发环境 (IDE)
- TMS320F28XXX开发板
- XDS100V3烧写器
项目创建及配置
- 准备两个不同的工程
- 修改CPU2的配置
- 在CPU中默认定义FLASH
程序编写
介绍
对于DSP的双核使用,双核DSP上电后,启动运行,在系统复位或者重新上电之后,CPU2系统一直处于复位状态。DSP中CPU1负责系统启动和初始化。必须在CPU1中启动CPU2。CPU2是无法配置GPIO的,它只能CPU1来配置。从这里看出来,DSP的CPU1和CPU2地位并不相同,CPU1的地位更高,有点像AMP。但是很多地方都说DSP的双核架构更接近于SMP架构,两个内核独立运行,通过专用的通信机制进行数据交换和协同工作。这种架构在需要高度并行处理能力的嵌入式系统中非常有用,因为它允许开发人员将不同的任务分配给不同的内核,从而提高系统的整体性能和响应速度。这点就见仁见智了,但我觉得,纯看功能开发,还是以AMP看更合适。
CPU1
- 首先,我们需要启动CPU2
#ifdef _FLASH
//
// Send boot command to allow the CPU2 application to begin execution
//
Device_bootCPU2(C1C2_BROM_BOOTMODE_BOOT_FROM_FLASH);
#else
//
// Send boot command to allow the CPU2 application to begin execution
//
Device_bootCPU2(C1C2_BROM_BOOTMODE_BOOT_FROM_RAM);
#endif // _FLASH
- 我们配置CPU1和CPU2要使用的GPIO
GPIO_setMasterCore(91, GPIO_CORE_CPU1);
GPIO_setPinConfig(GPIO_91_GPIO91);
GPIO_setDirectionMode(91, GPIO_DIR_MODE_OUT);
GPIO_setPadConfig(91, GPIO_PIN_TYPE_PULLUP);
GPIO_setMasterCore(93, GPIO_CORE_CPU2);
GPIO_setPinConfig(GPIO_93_GPIO93);
GPIO_setDirectionMode(93, GPIO_DIR_MODE_OUT);
GPIO_setPadConfig(93, GPIO_PIN_TYPE_PULLUP);
- 应用程序,我们放置一个LED翻转程序
GPIO_togglePin(91);
DEVICE_DELAY_US(500000);
- 完整程序
//
// Included Files
//
#include "driverlib.h"
#include "device.h"
//
// Main
//
void main(void)
{
//
// Initialize device clock and peripherals
//
Device_init();
#ifdef _FLASH
//
// Send boot command to allow the CPU2 application to begin execution
//
Device_bootCPU2(C1C2_BROM_BOOTMODE_BOOT_FROM_FLASH);
#else
//
// Send boot command to allow the CPU2 application to begin execution
//
Device_bootCPU2(C1C2_BROM_BOOTMODE_BOOT_FROM_RAM);
#endif // _FLASH
//
// Initialize GPIO and configure the GPIO pin as a push-pull output
//
Device_initGPIO();
GPIO_setMasterCore(91, GPIO_CORE_CPU1);
GPIO_setPinConfig(GPIO_91_GPIO91);
GPIO_setDirectionMode(91, GPIO_DIR_MODE_OUT);
GPIO_setPadConfig(91, GPIO_PIN_TYPE_PULLUP);
GPIO_setMasterCore(93, GPIO_CORE_CPU2);
GPIO_setPinConfig(GPIO_93_GPIO93);
GPIO_setDirectionMode(93, GPIO_DIR_MODE_OUT);
GPIO_setPadConfig(93, GPIO_PIN_TYPE_PULLUP);
//
// Configure CPU2 to control the LED GPIO
//
//
// Initialize PIE and clear PIE registers. Disables CPU interrupts.
//
Interrupt_initModule();
//
// Initialize the PIE vector table with pointers to the shell Interrupt
// Service Routines (ISR).
//
Interrupt_initVectorTable();
//
// Enable Global Interrupt (INTM) and realtime interrupt (DBGM)
//
EINT;
ERTM;
//
// Loop Forever
//
for(;;)
{
GPIO_togglePin(91);
DEVICE_DELAY_US(500000);
}
}
//
// End of File
//
CPU2
这里我们就放置一个不用配置GPIO的LED翻转程序就行了
#include "driverlib.h"
#include "device.h"
void main(void)
{
Device_init();
Interrupt_initModule();
Interrupt_initVectorTable();
EINT;
ERTM;
for(;;)
{
GPIO_togglePin(93);
DEVICE_DELAY_US(500000);
}
}
编译及烧写
-
Build CPU1工程
-
Build CPU2工程
-
为了能将CPU1和CPU2的固件一起烧录到芯片中,需要做一些配置。
-
右键CPU1,选择Debug As ,然后选择Debug 配置。
-
.右键CPU1,选择Debug As ,然后选择Debug 配置。 然后取消选定CPU2的内容
-
右键CPU2,选择Debug As ,然后选择Debug 配置。 然后选定CPU的内容
-
点击Program选项
8. 在Device下拉菜单中,选择CPU2
点击Project栏最右手边的WorkSpace,选择CPU2的项目
9. 点击Apply ,点击Close。
10. 以现在的配置,选中Angus_CPU1项目,然后点击绿色神虫,即可一键正确烧写多核程序。
后续
更多精彩,欢迎关注公众号:物联网知识