gpt4 book ai didi

crash - ISR期间的sprintf是否导致崩溃?

转载 作者:行者123 更新时间:2023-12-03 17:23:24 61 4
gpt4 key购买 nike

我正在尝试格式化字符串,然后在ISR期间将其打印出到LCD。 ISR可以正常工作,并且将sprintf()注释掉;但是在引入ISR时,程序会崩溃。

void __ISR(_CHANGE_NOTICE_VECTOR, IPL1) CNIntHandler(void) {
//more of my code later
LATBINV = LEDC; //invert LEDC to a 1
hw_msDelay(20);

int buttons = read_buttons();
decode_buttons(buttons, &g_step_mode, &g_step_dir, &g_motor_delay);

LATBINV = LEDC; //reinvert LEDC to 0

mCNClearIntFlag(); //clear the CN flag
}
sprintf()发生在 decode_buttons()功能内:
void decode_buttons(int f_buttons, int *f_step_mode, int *f_step_dir, int *f_motor_delay) {
char f_mode_str;
char f_dir_str;
int f_RPM;
char f_LCD_str;

switch(f_buttons) {
case 0x0000: //none pressed
*f_step_mode = HS;
f_mode_str = "HALF";
*f_step_dir = CW;
f_dir_str = "CW";
*f_motor_delay = 20; // semipermanent value
f_RPM = 15;
break;

case 0x0040: //BTN 1 pressed
*f_step_mode = FS;
f_mode_str = "FULL";
*f_step_dir = CW;
f_dir_str = "CW";
*f_motor_delay = 40;
f_RPM = 15;
break;

case 0x0080: // BTN 2 pressed
*f_step_mode = HS;
f_mode_str = "HALF";
*f_step_dir = CCW;
f_dir_str = "CCW";
*f_motor_delay = 30;
f_RPM = 10;
break;

case 0x00C0: //Both pressed
*f_step_mode = FS;
f_mode_str = "FULL";
*f_step_dir = CCW;
f_dir_str = "CCW";
*f_motor_delay = 24;
f_RPM = 25;
break;

default:
break;
}

sprintf(f_LCD_str, "%s %s %d", f_dir_str, f_mode_str, &f_RPM);
LCD_puts(f_LCD_str); //output string to LCD

return;
}

我正在开发PIC32 Cerebot板上,目标是使用步进电机的当前模式,方向和RPM更新LCD。我会澄清我所能做的,并发布任何需要的内容。

最佳答案

sprintf组成一个字符串并将其存储在必须足够大的数组中:http://www.cplusplus.com/reference/cstdio/sprintf/

在您的代码中,传递给sprintf的输出缓冲区被声明为

char f_LCD_str;

这不是一个数组,而是一个字符。 sprintf将不可避免地溢出。
一个好的宣言是
char f_LCD_str[30];

(与其他字符数组的注释相同:f_mode_str和f_dir_str)

使用snprintf总是更安全,以避免溢出风险。在这种情况下,调用将是:
sprintf(f_LCD_str, 30, "%s %s %d", f_dir_str, f_mode_str, f_RPM);

注意:&f_RPM将打印变量的地址,其中f_RPM将打印出变量值,具体取决于您想要的内容。

关于crash - ISR期间的sprintf是否导致崩溃?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29309754/

61 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com