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.
尊敬的香榭丽舍
我要向我们的客户询问这一点吗?
用户使用 CLA 任务8作为后台任务。
我们发现、只要使用 EALLOW/EDIS、这种简单的语句就不能用于后台任务。
1.以下代码
#pragma INTERRUPT (Cla1Task8_background、"background")
中断空 Cla1Task8_background()
{
…
EALLOW;
GpioCtrlRegs.GPAMUX1.bit.GPIO0=0;
GpioCtrlRegs.GPAMUX1.bit.GPIO1=0;
EDIS;
.
}
2.后台任务中调用的子内联函数中的以下代码。
#pragma INTERRUPT (Cla1Task8_background、"background")
中断空 Cla1Task8_background()
{
…
CONFIG_PWM_TO_GPIO ();
.
}
#pragma FUNC_ALWAYS_INLINE (CONFIG_PWM_TO_GPIO)
静态内联 void CONFIG_PWM_TO_GPIO()
{
EALLOW;
GpioCtrlRegs.GPAMUX1.bit.GPIO0=0;
GpioCtrlRegs.GPAMUX1.bit.GPIO1=0;
EDIS;
// GPIO_setPinConfig (GPIO_0_GPIO0);这是不允许的、因为内部使用了 EALLOW/EDIS。
}
编译器错误为:
错误#99923:CLA 不允许在后台任务中进行函数调用。 尝试内联函数。
CLA 后台任务中是否不允许 EALLOW/EDIS?
如果是、用户如何在 CLA 后台任务中修改受 EALLOW 保护的这些寄存器?
黄维恩
您好、Wayne、
对于 CLA 源代码、您必须使用 MEALLOW 和 MEDIS、而不是 EALLOW 和 EDIS。
请参阅 TRM (spruiw9)第7.6.3章(第835/836页)。
此致、
1月
您好、Jan、
在 C2000Ware 头文件中、EALLOW 和 EDIS 宏会根据 CPU 类型进行适当映射、因此这不是问题所在。
下面是代码片段:
//
//定义允许写入受保护的寄存器
//
#ifndef EALLOW
#ifndef __TMS320C28XX_CLA__
#define EALLOW __EALLOW ()
其他
#define EALLOW __meallow()
#endif //__TMS320C28XX_CLA__
#endif // EALLOW
谢谢、
Ashwini
您好、Wayne、
EALLOW 和 EDIS 被映射到 CLA 编译器内在函数、这些内在函数看起来是函数调用、因此您会看到错误。 让我询问编译器团队、是否有某种方法可以在后台任务中使用这些工具。
谢谢、
Ashwini
您好、Wayne、
编译器团队和我都尝试过、我们无法重现此问题-编译工作正常、只能用于后台任务和内联函数。 您能告诉我正在使用的编译器版本和编译器优化选项吗?
谢谢、
Ashwini
尊敬的 Ashwini:
我在下面用于重现用户的行为。
CCS 11.0
C2000ware V4
编译器 V21.6.0.LTS
-opt_level 1
-opt_for_speed 3.
我还向您发送了一个项目来重现此问题。
如果您对重现此问题还有任何疑问、请告诉我。
黄维恩
尊敬的 Ashwini:
我们尝试使用__meallow()来替换 EALLOW 和使用__mdies()来替换 EDIS,它现在适用于上述两种用法。
因此、剩下的问题是:
1) 1)您说过如下。 为什么不起作用?
//
//定义允许写入受保护的寄存器
//
#ifndef EALLOW
#ifndef __TMS320C28XX_CLA__
#define EALLOW __EALLOW ()
其他
#define EALLOW __meallow()
#endif //__TMS320C28XX_CLA__
#endif // EALLOW
2) 2)如果我们使用诸如 GPIO_setPinConfig (GPIO_14_GPIO14)之类的 driverlib;它内部有 EALLOW/EDIS、它在 CLA 端工作吗?
(现在、我的侧不起作用。)
黄维恩
您好、Wayne、
非常感谢您共享代码。 我要看一下。
关于 GPIO_setPinConfig (GPIO_14_GPIO14)、这应该也适用于 CLA 端、查看您发送的项目可能会提供一些线索、说明它为什么不适合您。
我最多会在一天或两天内回来。
谢谢、
Ashwini
您好、Ashwini、
如果你使用 CLA、你必须考虑除 CPU 之外的其他规则。 因此、替代 MEALLOW 和 MEDIS 溶解是没有意义的。
除了简化之外、一切都是不必要的复杂。 这显然证明了韦恩的问题。
使用 CLA 命令集也有什么困难?
此致、Jan
您好、Jan、
发送的应用程序 Wayne 包含位字段头文件 f28003x_device.h、与 driverlib 头文件不同、该文件仅将定义映射到 C28 instrincs __EALLOW ()和__EDIS ()。 因此、为 CLA 编译的 driverlib 源代码不起作用、因为 C28定义正在被挑选。
此修复程序将更新 f28003x_device.h 例如、对于 EALLOW、更新定义
从(电流):
#define EALLOW __EALLOW ()
至:
#ifndef EALLOW
#ifndef __TMS320C28XX_CLA__
#define EALLOW __EALLOW ()
其他
#define EALLOW __meallow()
#endif //__TMS320C28XX_CLA__
#endif // EALLOW
软件团队已收到此问题的通知。
谢谢、
Ashwini
您好 Ashwini、
我不是这个替换产品的朋友。
我希望 MEALLOW/MEDIS 出现在我的 CLA 代码中、而不是 EALLOW/EDIS (它们是 CPU 指令)。
此致、
1月
您好!
关于在 CLA 上使用 GPIO_setPinConfig、我想补充一点:
CLA 无法访问 GPIO 控制寄存器。 CLA 只能访问 GPIO 数据寄存器。
GPIO_setPinConfig 在.c 文件中定义、因此它使用 C28x 指令。 您可以在 CLA 代码中使用.h 文件中定义的内联函数。
此致、
Veena
您好、Jan、
EALLOW 和 EDIS 是 C 代码中的宏名称、CLA 和 C28都可以调用这些名称。 宏名称反映了最初为 C28编写的代码的 C28名称。 宏将根据 CLA 代码是调用 C 代码(在这种情况下、_ TMS320C28XX_CLA__由编译器定义)还是 C28代码来映射到 CLA 或 C28指令。
谢谢、
Ashwini
您好、Wayne、
已向软件团队提交问题以修复位字段头文件。
目前、您可以 使用 driverlib 文件中的 EALLOW 和 EDIS 定义更新位字段头文件 f28003x_device.h。
谢谢、
Ashwini