Thread 中讨论的其他器件:C2000WARE
工具与软件:
您好!
我有一个由 C28x 内核软件触发的 CLA 任务。
任务的代码非常简单:
__interrupt void step(void)
{
__mdebugstop();
GPIO_togglePin(40U);
G_U.V1 = ADC_readResult(ADCBRESULT_BASE, ADC_SOC_NUMBER0);
G_U.V2 = ADC_readResult(ADCCRESULT_BASE, ADC_SOC_NUMBER0);
G_U.Vex = ADC_readResult(ADCDRESULT_BASE, ADC_SOC_NUMBER0);
G_U.i = exec_count;
if (exec_count == 36)
{
exec_count = 0;
}
else
{
exec_count++;
}
}
操作变量的定义与 C28x 内核代码中的定义类似:
#pragma DATA_SECTION(G_U,"Cla1DataRam") G_ExternalInputs G_U; #pragma DATA_SECTION(exec_count,"Cla1ToCpuMsgRAM") int16_t exec_count;
结构类型定义如下:
typedef struct {
uint32_T V1; /* '<Root>/V1' */
uint32_T V2; /* '<Root>/V2' */
uint32_T Vex; /* '<Root>/Vex' */
int32_T i; /* '<Root>/i' */
uint32_T PinProg; /* '<Root>/PinProg' */
} G_ExternalInputs;
当我运行代码时、变量被适当更新、除了 G_U 结构中保持为0的 V1元素。
我 使用调试器运行代码以尝试理解、相应的汇编代码如下所示:
我必须承认、我不理解的一件奇怪的事情是分解是由.word 0x7BC0替代的行。
但是、无论如何、当我一步一步地运行它时、MR0在 MMOVZ16 MR0、@xb20之后确实包含了正确的值
但是 在 MMOV32 @0x9808、MR0之后的第一个 NOP 变为0、因此0被存储在结构项中。
该结构的其他变量不会发生这种行为、在 NOP 执行时、我看到 MR0寄存器会随 MLSR/MMOV 的执行而相应地发生变化。
不知道那里发生了什么,有什么想法?
Cl é ment

