Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/entity-framework/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Crash ISR期间的sprintf导致崩溃?_Crash_Printf_Interrupt_Isr - Fatal编程技术网

Crash ISR期间的sprintf导致崩溃?

Crash ISR期间的sprintf导致崩溃?,crash,printf,interrupt,isr,Crash,Printf,Interrupt,Isr,我正在尝试格式化字符串,然后在ISR期间将其打印到LCD。ISR功能正常,已注释掉sprintf();但当它被引入时,程序在ISR期间崩溃 sprintf()出现在解码按钮()功能中: 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

我正在尝试格式化字符串,然后在ISR期间将其打印到LCD。ISR功能正常,已注释掉
sprintf()
;但当它被引入时,程序在ISR期间崩溃

sprintf()
出现在
解码按钮(
)功能中:

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 Cerbot板,目标是用步进电机的当前模式、方向和转速更新LCD。我将澄清我能做什么,并发布任何需要的内容。

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将根据您的需要打印变量值。

我明天必须尝试此操作,非常感谢!你在这方面有进展吗?如果问题得到解决,请投票并接受答案。谢谢
sprintf(f_LCD_str, 30, "%s %s %d", f_dir_str, f_mode_str, f_RPM);