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.
我遇到了以下问题。 当我将一个代码复制到我的主代码中时、它工作正常。 只有当数据是结构时、结果才为零
struct cla_Estdata_
{
MOSPROF_STATE 状态;
int speed_Hz;
motorpos_t position_cnt;
浮动扭矩;
int 计数器;
};
typedef 结构 cla_RESdata_ volatile cla_RESdata_t;
CLA:
#pragma DATA_SECTION (CLA_estdata、"Cla1ToCpuMsgRAM")
易失性 CLA_Estdata_t CLA_estdata;
#pragma DATA_SECTION (CLA_TEST、"Cla1ToCpuMsgRAM")
volatile int CLA_test;
_interrupt void Cla1Task4 (void)
{ cla_estdata.counter++;
CLA_TEST++;
}
主代码:
静态内联 CLA_Update_clafreq (void)
{
extern volatile CLA_Estdata_t CLA_estdata;
extern volatile int cla_test;
extern long volatile CLA_Freq;
cla_Freq=cla_test;
}
结果 CLA_freq 每次更新为新值
静态内联 CLA_Update_clafreq (void)
{
extern volatile CLA_Estdata_t CLA_estdata;
extern volatile int cla_test;
extern long volatile CLA_Freq;
cla_Freq=cla_estdata.counter;
}
结果:CLA_Freq 始终为零。 在调试窗口中、我看到 CLA_estdata.counter 正在计数。 因此、CLA_estdata.counter 被填充正确的数据、因此 CPU 为何无法访问它。
有人建议如何解决这个问题? 单个变量和结构之间有何区别?
这两个测试之间没有变化、除了 CLA_FREQ 中存储了哪个变量。 在调试窗口中、我可以看到 CLA 正确填充变量。
那么、CLA 和 CPU 之间的区别是什么? 我唯一能找到的东西是内存总线宽度。 因此、我开始重新排列 结构、并使所有变量的宽度都为32位。 之后 它开始工作。
因此、您在编译器中遇到了一个问题。 仅在我上次报告问题时。 TI 可以做的最好的事情是建议手动修改 asm 代码以使其正常工作。 因此这是无用的。
那么、是否有编译器指令告知 CPU 结构是32位对齐的?
谢谢!
[引用 user="Sal Pezzino">如果使用定义存储器大小的数据类型、我认为即使使用16位类型、也能正常工作。 您可以尝试使用标准数据类型来声明结构、例如:int16_t、uint16_t、int32_t、float32_t 等
希望这对您有所帮助、
SAL
[/报价]
stdint.h
typedef int int16_t;
typedef unsigned int uint16_t;
typedef long int32_t;
typedef unsigned long uint32_t;
如果您不知道、请将我的问题转发 给更高级的人。
如果我更改 CLA 中结构变量的顺序。 我可以更改输出的结果。 我认为这是一个问题。 我在从 CLA 读回数据时遇到很多问题、因此我花了几天时间对其进行调试。 编译器中数据结构中的32位与16位数据宽度存在问题。 很容易重现。
额外注意事项:还要检查 CPU 和 CLA 枚举的大小。 如果在 CPU 的枚举中设置了一个值。 CLA 可以读取其他内容。 因为 CPU 无法设置 CLA 数据字段的更高16位字枚举。 在 Init 时可能有一个随机值。 CPU 无法更改它。