This thread has been locked.

If you have a related question, please click the "Ask a related question" button in the top right corner. The newly created question will be automatically linked to this question.

[参考译文] TMS320F28374S:如何减少通过器件支持编译的项目的执行时间。

Guru**** 2386610 points
Other Parts Discussed in Thread: TMS320F28374S, C2000WARE
请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

https://e2e.ti.com/support/microcontrollers/c2000-microcontrollers-group/c2000/f/c2000-microcontrollers-forum/1422984/tms320f28374s-how-to-reduce-the-execution-time-in-projects-build-from-device-support

器件型号:TMS320F28374S
Thread 中讨论的其他器件: C2000WARE

工具与软件:

大家好  

正如您在图片中看到的、我有两个项目、分别名为 demo2和 demo3。 我当前正在为我的项目使用 TMS320F28374S 微控制器。  如文档中所述、我已经开发了两个工程、一个来自 driverlib、另一个来自器件支持以执行相同的任务。 当我根据 demo2 (driverlib)进行编译时、GPIO26每6 u-Sec 进行一次切换、当我从 demo3 (器件支持)进行编译时、需要40 u-Sec

我想知道为什么在同一硬件上运行相同函数所花费的时间大不相同。 我想知道在配置 demo3项目时遇到了什么错误。 我已按照文档 F2837xS_FRM_EX_UG 中的每条指令 配置项目。

这是为  F2837xS_SYSCTRL.c 文件中的 InitSysCtrl 函数编写的代码。  

void InitSysCtrl (void)

//
//禁用看门狗
//
DisableDog ();

#ifdef _flash
//
//将时间关键代码和闪存设置代码复制到 RAM。 其中包括
//以下函数:InitFlash ()
//
// RamfuncsLoadStart、RamfuncsLoadSize 和 RamfuncsRunStart
//符号是由链接器创建的。 请参阅器件.cmd 文件。
//
memcpy (&RamfuncsRunStart、&RamfuncsLoadStart、(size_t)&RamfuncsLoadSize);

//
//调用闪存初始化以设置闪存等待状态。 该函数必须
//驻留在 RAM 中。
//
Flash_Bank 0();
#endif

//
//*重要*
//
// Device_cal 函数、可复制 ADC 和振荡器校准
//出现 TI 中保留的 OTP 值到相应的调整寄存器中
//在引导 ROM 中自动执行。 旁路掉时、就会发现这一点
//调试过程中、必须为 ADC 和调用以下函数
//振荡器按规范运行。 的需求
//调用此函数之前必须启用 ADC。
//
//有关更多信息、请参见器件数据手册和/或 ADC 参考手册
//信息。
//
EALLOW;

//
//尽快在未绑定的 IO 上启用上拉以降低功耗
//消耗。
//
GPIO_EnableUnbondedIOPullups();

CpuSysRegs.PCLKCR13.bit.ADC_A = 1;
CpuSysRegs.PCLKCR13.bit.ADC_B = 1;
CpuSysRegs.PCLKCR13.bit.ADC_C = 1;
CpuSysRegs.PCLKCR13.bit.ADC_D = 1;

//
//检查器件是否已修整
//
if (*((UINT16 *) 0x5D1B6)=0x0000){
//
///设备未修整-应用静态校准值
//
AnalogSubsysRegs.ANAREFTRIMA.ALL = 31709;
AnalogSubsysRegs.ANAREFTRIMB.All = 31709;
AnalogSubsysRegs.ANAREFTRIC.all = 31709;
AnalogSubsysRegs.ANAREFTRIMD.All = 31709;
}

CpuSysRegs.PCLKCR13.bit.ADC_A = 0;
CpuSysRegs.PCLKCR13.bit.ADC_B = 0;
CpuSysRegs.PCLKCR13.bit.ADC_C = 0;
CpuSysRegs.PCLKCR13.bit.ADC_D = 0;
EDIS;

//
//初始化 PLL 控制:SYSPLLMULT 和 SYSCLKDIVSEL。
//
//定义要作为参数传递给此函数的已定义选项
//(在 F2837xS_examples.h 中)
//
//注意:如果是、内部振荡器不能用作 PLL 源
// PLLSYSCLK 配置为高于194 MHz 的频率。
//
// PLLSYSCLK =(XTAL_OSC)*(IMULT + FMULT)/(PLLSYSCLKDIV)
//
#ifdef _LAUNCHXL_F28377S
InitSysPll (XTAL_OSC、IMULT_40、FMULT_0、PLLCLK_BY_2);
#else
InitSysPll (XTAL_OSC、IMULT_20、FMULT_0、PLLCLK_BY_2);
#endif

//
//打开所有外设
//
InitPeripheralClocks();
}

在 demo2 (driverlib)的 main.c 中写入的代码如下:

#include "main.h"

浮点 T;
PLL_datatype grid_volt;

int main (void)

device_init();
Interrupt_initModule();
interrupt_initVectorTable();
interrupt_enableMaster();
InitializeGPIO();

EINT;
ERTM;

while (1)

GPIO_writePin (26、1);
PLL (&grid_volt、T);
PLL (&grid_volt、T);
GPIO_writePin (26、0);

}
}

dem3 (器件支持)的 main.c 中写入的代码如下:

#include
#include "main.h"

浮点 T;
PLL_datatype grid_volt;
int main (void)

InitSysCtrl();//系统初始化
EALLOW;
GpioCtrlRegs.GPAMUX2.bit.GPIO26 = 0;// GPIO34作为 GPIO
GpioCtrlRegs.GPAGMUX2.bit.GPIO26 = 0;// GPIO34作为 GPIO
GpioCtrlRegs.GPADIR.bit.GPIO26 = 1;// Direct GPIO as output
EDIS;
while (1)

GpioDataRegs.GPATOGGLE.bit.GPIO26 = 1;
PLL (&grid_volt、T);
GpioDataRegs.GPATOGGLE.bit.GPIO26 = 1;
}

}

提前感谢您。

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好!

    首先、在两个示例之间似乎没有执行完全相同的函数。 分别是在 PLL 之前将 GPIO 写入高电平、在 PLL 之后写入低电平。 另一方面、将 GPIO 切换至相反的状态。 此外、与直接在 bitfield 中写入寄存器相比、使用 driverlib 将花费更多的周期-您可以检查反汇编代码并在两者之间进行比较。 此外、是否还因为一个项目中有两个 PLL 调用、而另一个项目中有一个 PLL 调用?

    此致、

    Allison

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    首先感谢 Allison、

    是的、您正确注意到了两次 PLL 调用。 这是我的错。

    在两个项目中的单个 PLL 调用中、driverlib 占用3微秒、器件支持占用20微秒。 在本例中、驱动程序库非常快。 切换 GPIO 和直接写入 bitfield 中的寄存器应该没有这么大的差异。

    我假设我可能没有 在 decive 支持示例中正确配置系统 PLL (而非函数)、即 InitSysCtrl (void)。 您能检查一下吗?

    如何检查反汇编代码?  

    谢谢  

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    尊敬的 Abhinav:

    我同意时间差不应太大。 您可以转至 CCS 工具栏并选择"View">"Disassembly"来检查反汇编。 这将打开正确的窗口、您可以对两者进行比较。  

    您是否参考了我们的 C2000ware 示例? 如果是、则在任一种情况下(driverlib 或 bitfield)、都应在 main 中设置器件初始化。  

    此致、

    Allison

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好、Allison、

    可以通过在 预定义的符号段中添加符号"_FLASH"来解决该问题。 现在这两个项目都在花费相同的时间(可能有一些差异在几个 n 秒,我不介意)。

    感谢你的帮助。