您好!
我在头文件中定义了一个结构、如下所示:
typedef struct CommutationStep { uint16_t index; uint16_t hall_val; struct Commutstep * nutstep; struct CommutStep * prev_step; }Commutstep;
在包含 main()的文件中,我有一个其他结构:
typedef struct MotorInfo { CommutationStep * comm_table; uint16_t hall_raw;
uint16_t prev_hall;
bool 被去除回弹; //其他未使用的字段 } MotorInfo;
在主代码中、我初始化名为"motor"的 MotorInfo 结构 。 *comm_table 还正确指向6元素循环数组的第一个元素。 (调试器已验证、到目前为止循环列表还不错)
接下来、我的主函数有无限循环:
while (1) { 如果(!motor.debounced) { SET_SAVE_STEP (MOTOR.HALL_RAW); } Motor.HALL_RAW = get_HALL_val (); 去抖霍尔(&motor); }
和去抖霍尔函数:
void debounce_hall (MotorInfo *电机) { //检查如果 (debounce_level < 1 || debounce_level > 5)//(此处有错误) { 电机->debounced = false; 返回 ;} 如果(去抖电平= 1) { IF (MOTOR->HALL_RAW!= MOTOR->PRV_HALL) { //将 comm_table 指向与原始霍尔 val 匹配的步骤 while (motion->comm_table->next step->hall_val!= motion->hall_raw) { 电机->comm_table =电机->comm_table->next _step; } 电机->comm_table =电机->comm_table->next _step; MOTOR->prev_hall = MOTOR->HALL_RAW; 电机->debounced = false; } 其他 { 电机->debounced = true; } return; } else { //其他代码,不感兴趣 } }
现在我的问题是:COMM_TABLE 指向六个地址中的一个0x00000410-420-430-450-460。 MotorInfo 电机地址为0x00000404。 我逐步手动调试、每次都将 HALL_RAW 设置为下一步。 当 comm_table 指向第六步时、地址正确为0x00000460、next _step 为410、之前的450。 检查调试器上的 NEW_STEP、它仍然正确地指向下一个和 PRV 地址。 现在、我处于第二次旋转的开始位置、我正确设置 HALL_RAW 以匹配第一步。 调用 debounce_hall (&motor)、并且仍然每个单个地址指向预期的步骤。 在函数的第1行(此处为注释//错误)、地址0x00000410处的结构(第一步)突然得到修改的字段:NEW_STEP 现在不是指向0x00000420而是指向0x00000404。 (电机结构地址)。
这可能是什么原因?
提前感谢您!