主题中讨论的其他器件:C2000WARE
您好!
我在 CPU 1上运行了一个 FreeRTOS 项目。 我想在其中添加一个使用 DCL 库中的 CLA 的 PI 控制器。
我是否可以遵循 F2837xD 的示例项目?
此致、
Rashmitha
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.
您好!
我在 CPU 1上运行了一个 FreeRTOS 项目。 我想在其中添加一个使用 DCL 库中的 CLA 的 PI 控制器。
我是否可以遵循 F2837xD 的示例项目?
此致、
Rashmitha
您好、 Rashmitha、
我们没有基于 F2837xD 的示例。 下面 是 C2000ware 中 F28069器件的一个基于 CLA 的 PI 示例。
C:\ti\c2000Ware_4_01_00_00\libraries\control\DCL\c28\examples\F28069_pi_cla
此致、
韩文
您好、 Hans Zhang、
感谢您的回复。
我指的是您建议的示例、也指为 F2837xD 提供的 CLA 示例、以了解所需的链接器文件更改。
我看到 DCLCLA.h 文件为实现2个并行 PID 回路提供了以下原型
extern float32_t DCL_runPID_L1 (DCL_PID_CLA *p、float32_t rk、float32_t lk、float32_t lk);
extern float32_t DCL_runPID_L2 (DCL_PID_CLA *p、float32_t rk、float32_t lk、float32_t lk);
我想知道是否可以同时使用3个 PI 环路。
此外、是否有多个 PI 环路同时运行的示例?
此致、
Rashmitha
您好、 Hans Zhang
感谢您的回复。 我肯定会使用多个实例而不是 L1/L2。
我收到一些有关 w.r.t 的警告。在链接器文件中所做的更改如下所示。

我的链接器文件如下所示、我将 CLA 包含的项目中的链接器文件的一部分添加到了我的原始链接器文件中
#ifdef CLA_C
// Define a size for the CLA scratchpad area that will be used
// by the CLA compiler for local symbols and temps
// Also force references to the special symbols that mark the
// scratchpad are.
CLA_SCRATCHPAD_SIZE = 0x100;
--undef_sym=__cla_scratchpad_end
--undef_sym=__cla_scratchpad_start
#endif //CLA_C
MEMORY
{
PAGE 0 : /* Program Memory */
/* Memory (RAM/FLASH) blocks can be moved to PAGE1 for data allocation */
/* BEGIN is used for the "boot to Flash" bootloader mode */
BEGIN : origin = 0x080000, length = 0x000002
RAMM0 : origin = 0x000123, length = 0x0002DD
RAMD0 : origin = 0x00B000, length = 0x000800
RAMLS0 : origin = 0x008000, length = 0x000800 //2kb
RAMLS1 : origin = 0x008800, length = 0x000800
RAMLS2 : origin = 0x009000, length = 0x000800
RAMLS3 : origin = 0x009800, length = 0x000800
RAMLS4 : origin = 0x00A000, length = 0x000800
RAMGS14 : origin = 0x01A000, length = 0x001000 /* Only Available on F28379D, F28377D, F28375D devices. Remove line on other devices. */
RAMGS15 : origin = 0x01B000, length = 0x000FF8 /* Only Available on F28379D, F28377D, F28375D devices. Remove line on other devices. */
// RAMGS15_RSVD : origin = 0x01BFF8, length = 0x000008 /* Reserve and do not use for code as per the errata advisory "Memory: Prefetching Beyond Valid Memory" */
RESET : origin = 0x3FFFC0, length = 0x000002
/* Flash sectors */
FLASHA : origin = 0x080002, length = 0x001FFE /* on-chip Flash */
FLASH_B_C_D : origin = 0x082000, length = 0x006000 /* on-chip Flash */
// FLASHB : origin = 0x082000, length = 0x002000 /* on-chip Flash */
// FLASHC : origin = 0x084000, length = 0x002000 /* on-chip Flash */
// FLASHD : origin = 0x086000, length = 0x002000 /* on-chip Flash */ //8kb
FLASHE : origin = 0x088000, length = 0x008000 /* on-chip Flash */
FLASHF : origin = 0x090000, length = 0x008000 /* on-chip Flash */
FLASHG : origin = 0x098000, length = 0x008000 /* on-chip Flash */
FLASHH : origin = 0x0A0000, length = 0x008000 /* on-chip Flash */
FLASHI : origin = 0x0A8000, length = 0x008000 /* on-chip Flash */
FLASHJ : origin = 0x0B0000, length = 0x008000 /* on-chip Flash */
FLASHK : origin = 0x0B8000, length = 0x002000 /* on-chip Flash */
FLASHL : origin = 0x0BA000, length = 0x002000 /* on-chip Flash */
FLASHM : origin = 0x0BC000, length = 0x002000 /* on-chip Flash */
FLASHN : origin = 0x0BE000, length = 0x001FF0 /* on-chip Flash */
// FLASHN_RSVD : origin = 0x0BFFF0, length = 0x000010 /* Reserve and do not use for code as per the errata advisory "Memory: Prefetching Beyond Valid Memory" */
PAGE 1 : /* Data Memory */
/* Memory (RAM/FLASH) blocks can be moved to PAGE0 for program allocation */
BOOT_RSVD : origin = 0x000002, length = 0x000121 /* Part of M0, BOOT rom will use this for stack */
RAMM1 : origin = 0x000400, length = 0x0003F8 /* on-chip RAM block M1 */
// RAMM1_RSVD : origin = 0x0007F8, length = 0x000008 /* Reserve and do not use for code as per the errata advisory "Memory: Prefetching Beyond Valid Memory" */
RAMD1 : origin = 0x00B800, length = 0x000800
RAMLS5 : origin = 0x00A800, length = 0x000800
RAMGS0 : origin = 0x00C000, length = 0x001000
RAMGS1 : origin = 0x00D000, length = 0x001000
RAMGS2 : origin = 0x00E000, length = 0x001000
RAMGS3 : origin = 0x00F000, length = 0x001000
RAMGS4 : origin = 0x010000, length = 0x001000
RAMGS5 : origin = 0x011000, length = 0x001000
RAMGS6 : origin = 0x012000, length = 0x001000
RAMGS7 : origin = 0x013000, length = 0x001000
RAMGS8 : origin = 0x014000, length = 0x001000
RAMGS9 : origin = 0x015000, length = 0x001000
RAMGS10 : origin = 0x016000, length = 0x001000
// RAMGS11 : origin = 0x017000, length = 0x000FF8 /* Uncomment for F28374D, F28376D devices */
// RAMGS11_RSVD : origin = 0x017FF8, length = 0x000008 /* Reserve and do not use for code as per the errata advisory "Memory: Prefetching Beyond Valid Memory" */
RAMGS11 : origin = 0x017000, length = 0x001000 /* Only Available on F28379D, F28377D, F28375D devices. Remove line on other devices. */
RAMGS12 : origin = 0x018000, length = 0x001000 /* Only Available on F28379D, F28377D, F28375D devices. Remove line on other devices. */
RAMGS13 : origin = 0x019000, length = 0x001000 /* Only Available on F28379D, F28377D, F28375D devices. Remove line on other devices. */
CPU2TOCPU1RAM : origin = 0x03F800, length = 0x000400
CPU1TOCPU2RAM : origin = 0x03FC00, length = 0x000400
CLA1_MSGRAMLOW : origin = 0x001480, length = 0x000080
CLA1_MSGRAMHIGH : origin = 0x001500, length = 0x000080
}
SECTIONS
{
/* Allocate program areas: */
.cinit : > FLASH_B_C_D PAGE = 0, ALIGN(8)
// .text : >> FLASHB | FLASHC | FLASHD | FLASHE PAGE = 0, ALIGN(8)
// .text : >> FLASHB_C | FLASHD | FLASHE PAGE = 0, ALIGN(8)
.text : >> FLASH_B_C_D | FLASHE PAGE = 0, ALIGN(8)
codestart : > BEGIN PAGE = 0, ALIGN(8)
/* Allocate uninitalized data sections: */
.stack : > RAMM1 PAGE = 1
.switch : > FLASH_B_C_D PAGE = 0, ALIGN(8)
.reset : > RESET, PAGE = 0, TYPE = DSECT /* not used, */
#if defined(__TI_EABI__)
.init_array : > FLASH_B_C_D, PAGE = 0, ALIGN(8)
.bss : > RAMLS5, PAGE = 1
.bss:output : > RAMLS3, PAGE = 0
.bss:cio : > RAMLS5, PAGE = 1
.data : > RAMLS5, PAGE = 1
.sysmem : > RAMLS5, PAGE = 1
/* Initalized sections go in Flash */
.const : > FLASHF, PAGE = 0, ALIGN(8)
#else
.pinit : > FLASH_B_C_D, PAGE = 0, ALIGN(8)
.ebss : >> RAMLS5 | RAMGS0 | RAMGS1, PAGE = 1
.esysmem : > RAMLS5, PAGE = 1
.cio : > RAMLS5, PAGE = 1
/* Initalized sections go in Flash */
.econst : >> FLASHF PAGE = 0, ALIGN(8)
#endif
Filter_RegsFile : > RAMGS0, PAGE = 1
SHARERAMGS0 : > RAMGS0, PAGE = 1
SHARERAMGS1 : > RAMGS1, PAGE = 1
ramgs0 : > RAMGS0, PAGE = 1
ramgs1 : > RAMGS1, PAGE = 1
Cla1ToCpuMsgRAM : > CLA1_MSGRAMLOW, PAGE = 1
CpuToCla1MsgRAM : > CLA1_MSGRAMHIGH, PAGE = 1
Cla1DataRam0 : > RAMLS1, PAGE = 0
Cla1DataRam1 : > RAMLS2, PAGE = 0
Cla1DataRam2 : > RAMLS3, PAGE = 0
/* CLA specific sections */
#if defined(__TI_EABI__)
Cla1Prog : LOAD = FLASHE,
RUN = RAMLS4,
LOAD_START(Cla1funcsLoadStart),
LOAD_END(Cla1funcsLoadEnd),
RUN_START(Cla1funcsRunStart),
LOAD_SIZE(Cla1funcsLoadSize),
PAGE = 0, ALIGN(8)
#else
Cla1Prog : LOAD = FLASHE,
RUN = RAMLS4,
LOAD_START(_Cla1funcsLoadStart),
LOAD_END(_Cla1funcsLoadEnd),
RUN_START(_Cla1funcsRunStart),
LOAD_SIZE(_Cla1funcsLoadSize),
PAGE = 0, ALIGN(8)
#endif
#ifdef CLA_C
/* CLA C compiler sections */
//
// Must be allocated to memory the CLA has write access to
//
CLAscratch :
{ *.obj(CLAscratch)
. += CLA_SCRATCHPAD_SIZE;
*.obj(CLAscratch_end) } > RAMLS1, PAGE = 0
.scratchpad : > RAMLS1, PAGE = 0
.bss_cla : > RAMLS1, PAGE = 0
.const_cla : > RAMLS1, PAGE = 0
#endif //CLA_C
Cla1Prog : > RAMLS4, PAGE=0
CLADataLS0 : > RAMLS0, PAGE=0
CLADataLS1 : > RAMLS1, PAGE=0
Cla1ToCpuMsgRAM : > CLA1_MSGRAMLOW, PAGE = 1
CpuToCla1MsgRAM : > CLA1_MSGRAMHIGH, PAGE = 1
#ifdef __TI_COMPILER_VERSION__
#if __TI_COMPILER_VERSION__ >= 15009000
#if defined(__TI_EABI__)
.TI.ramfunc : {} LOAD = FLASHE,
RUN = RAMLS0,
LOAD_START(RamfuncsLoadStart),
LOAD_SIZE(RamfuncsLoadSize),
LOAD_END(RamfuncsLoadEnd),
RUN_START(RamfuncsRunStart),
RUN_SIZE(RamfuncsRunSize),
RUN_END(RamfuncsRunEnd),
PAGE = 0, ALIGN(8)
#else
.TI.ramfunc : {} LOAD = FLASHE,
RUN = RAMLS0,
LOAD_START(_RamfuncsLoadStart),
LOAD_SIZE(_RamfuncsLoadSize),
LOAD_END(_RamfuncsLoadEnd),
RUN_START(_RamfuncsRunStart),
RUN_SIZE(_RamfuncsRunSize),
RUN_END(_RamfuncsRunEnd),
PAGE = 0, ALIGN(8)
#endif
#else
ramfuncs : LOAD = FLASHE,
RUN = RAMLS0,
LOAD_START(_RamfuncsLoadStart),
LOAD_SIZE(_RamfuncsLoadSize),
LOAD_END(_RamfuncsLoadEnd),
RUN_START(_RamfuncsRunStart),
RUN_SIZE(_RamfuncsRunSize),
RUN_END(_RamfuncsRunEnd),
PAGE = 0, ALIGN(8)
#endif
#endif
/* The following section definitions are required when using the IPC API Drivers */
GROUP : > CPU1TOCPU2RAM, PAGE = 1
{
PUTBUFFER
PUTWRITEIDX
GETREADIDX
}
GROUP : > CPU2TOCPU1RAM, PAGE = 1
{
GETBUFFER : TYPE = DSECT
GETWRITEIDX : TYPE = DSECT
PUTREADIDX : TYPE = DSECT
}
/* The following section definition are for SDFM examples */
Filter1_RegsFile : > RAMGS1, PAGE = 1, fill=0x1111
Filter2_RegsFile : > RAMGS2, PAGE = 1, fill=0x2222
Filter3_RegsFile : > RAMGS3, PAGE = 1, fill=0x3333
Filter4_RegsFile : > RAMGS4, PAGE = 1, fill=0x4444
Difference_RegsFile : >RAMGS5, PAGE = 1, fill=0x3333
}
/*
//===========================================================================
// End of file.
//===========================================================================
*/
请指导我清除上述警告吗? 是否需要包含其他一些.cmd 文件以支持 CLA?
当加载到处理器上时、使用此链接器文件生成的.out 文件无法显示任何符号。
您还能指出链接器文件中是否存在导致符号丢失的错误吗? 因为在添加 CLA 相关行之前的原始链接器文件工作正常并显示了符号。
此致、
Rashmitha
您好、Rashmitha、
链接器命令文件内容打包在#ifdef CLA_c 内 请在链接器设置中定义 CLA_C 符号。
以下是相关帖子:
谢谢、
Ashwini
您好 、Ashwini Athalye、
感谢您的回答。 我在命令文件预处理中定义了符号、甚至尝试删除#ifdefs。
符号仍然丢失。 当我加载代码时、我在调试窗口中看到下面的屏幕

此致、
Rashmitha
您好 、Ashwini Athalye、
1。 
2.当我从 CCS 菜单中单独加载时、我可以看到符号。 为什么会发生这种情况? 在添加 CLA 之前、项目正在自行加载符号
尽管我没有看到 CLA 的任何符号

此致、
Rashmitha
您好 、Ashwini Athalye、
我现在使用 的是 C:\ti\c2000Ware_4_00_00_00\device_support\f2837xd\con\cmd 中的2837xD_FLASH_CLA_lnk_cpu1.cmd
我在其中添加了几行以添加我的段。
我将使用以下函数来配置 CLA
//
// configClaMemory - Configure CLA memory
//
void configClaMemory(void)
{
#ifdef _FLASH
extern uint32_t Cla1funcsRunStart, Cla1funcsLoadStart, Cla1funcsLoadSize;
//
// Copy over code from FLASH to RAM
//
memcpy((uint32_t*) &Cla1funcsRunStart, (uint32_t*) &Cla1funcsLoadStart,
(uint32_t) &Cla1funcsLoadSize);
#endif //_FLASH
#ifdef CPU2
//
// Enable CPU2 clocking at the sys clock level
//
SysCtl_enablePeripheral(SYSCTL_PERIPH_CLK_CLA1);
#endif //CPU2
//
// Initialize and wait for CLA1ToCPUMsgRAM
//
MemCfg_initSections(MEMCFG_SECT_MSGCLA1TOCPU);
while (!MemCfg_getInitStatus(MEMCFG_SECT_MSGCLA1TOCPU))
{
}
//
// Initialize and wait for CPUToCLA1MsgRAM
//
MemCfg_initSections(MEMCFG_SECT_MSGCPUTOCLA1);
while (!MemCfg_getInitStatus(MEMCFG_SECT_MSGCPUTOCLA1))
{
}
//
// Select LS4RAM to be the programming space for the CLA
// First configure the CLA to be the master for LS4 and then
// set the space to be a program block
//
MemCfg_setLSRAMMasterSel(MEMCFG_SECT_LS4, MEMCFG_LSRAMMASTER_CPU_CLA1);
MemCfg_setCLAMemType(MEMCFG_SECT_LS4, MEMCFG_CLA_MEM_PROGRAM);
//
// Next configure LS0RAM and LS1RAM as data spaces for the CLA
// First configure the CLA to be the master for LS0(1) and then
// set the spaces to be code blocks
//
MemCfg_setLSRAMMasterSel(MEMCFG_SECT_LS0, MEMCFG_LSRAMMASTER_CPU_CLA1);
MemCfg_setCLAMemType(MEMCFG_SECT_LS0, MEMCFG_CLA_MEM_DATA);
MemCfg_setLSRAMMasterSel(MEMCFG_SECT_LS1, MEMCFG_LSRAMMASTER_CPU_CLA1);
MemCfg_setCLAMemType(MEMCFG_SECT_LS1, MEMCFG_CLA_MEM_DATA);
}
//
// CLA_initCpu1Cla1 - Initialize CLA1 task vectors and end-of-task interrupts
//
void CLA_initCpu1Cla1(void)
{
//
// Compute all CLA task vectors
// On Type-1 CLAs the MVECT registers accept full 16-bit task addresses as
// opposed to offsets used on older Type-0 CLAs
//
EALLOW;
CLA_mapTaskVector(CLA1_BASE, CLA_MVECT_1, (uint16_t) &Cla1Task1);
// CLA_mapTaskVector(CLA1_BASE, CLA_MVECT_2, (uint16_t) &Cla1Task2);
// CLA_mapTaskVector(CLA1_BASE, CLA_MVECT_3, (uint16_t) &Cla1Task3);
// CLA_mapTaskVector(CLA1_BASE, CLA_MVECT_4, (uint16_t) &Cla1Task4);
// CLA_mapTaskVector(CLA1_BASE, CLA_MVECT_5, (uint16_t) &Cla1Task5);
// CLA_mapTaskVector(CLA1_BASE, CLA_MVECT_6, (uint16_t) &Cla1Task6);
// CLA_mapTaskVector(CLA1_BASE, CLA_MVECT_7, (uint16_t) &Cla1Task7);
// CLA_mapTaskVector(CLA1_BASE, CLA_MVECT_8, (uint16_t) &Cla1Task8);
//
// Enable the IACK instruction to start a task on CLA in software
// for all 8 CLA tasks. Also, globally enable all 8 tasks (or a
// subset of tasks) by writing to their respective bits in the
// MIER register
//
CLA_enableIACK(CLA1_BASE);
CLA_enableTasks(CLA1_BASE, CLA_TASKFLAG_ALL);
//
// Configure the vectors for the end-of-task interrupt for all
// 8 tasks
//
Interrupt_register(INT_CLA1_1, &cla1Isr1);
Interrupt_register(INT_CLA1_2, &cla1Isr2);
Interrupt_register(INT_CLA1_3, &cla1Isr3);
Interrupt_register(INT_CLA1_4, &cla1Isr4);
Interrupt_register(INT_CLA1_5, &cla1Isr5);
Interrupt_register(INT_CLA1_6, &cla1Isr6);
Interrupt_register(INT_CLA1_7, &cla1Isr7);
Interrupt_register(INT_CLA1_8, &cla1Isr8);
//
// Enable CLA interrupts at the group and subgroup levels
//
Interrupt_enable(INT_CLA1_1);
Interrupt_enable(INT_CLA1_2);
Interrupt_enable(INT_CLA1_3);
Interrupt_enable(INT_CLA1_4);
Interrupt_enable(INT_CLA1_5);
Interrupt_enable(INT_CLA1_6);
Interrupt_enable(INT_CLA1_7);
Interrupt_enable(INT_CLA1_8);
}
然后在.cla 文件中、我定义了如下 CLA 任务
__interrupt void Cla1Task1(void)
{
__mdebugstop();
// run the PI controller
uk1 = DCL_runPI_L1(&pi1, rk1, yk1);
uk2 = DCL_runPI_L1(&pi2, rk2, yk2);
uk3 = DCL_runPI_L1(&pi3, rk3, yk3);
__mnop();
}
我可以编译项目、而不会出现任何错误或警告。 我可以看到 CPU 和 CLA 正在运行。 该控件到达 CLA 任务并在每次运行时停止、即使没有断点。
如何越过此内置断点、如行为?
此致、
Rashmitha