关于SO问题:52164135
设置:
我有一个将许多double
值转换为预定义字符串的函数。输入是一个array of struct
,我们将从中将两个double值连接为一个字符串。一个double的大小为8字节或64位,我的MCU为32位ARM微控制器STM32。
interrupt
也在并行运行。
数据应如下所示:
[[12.11111111,12.11111111],[12.22222222,12.22222222],...]
但是我(很少)得到:
[[12.11111111,12.11111111],[ 55.01 [12.33333333,12.33333333],...]
注意:我错过了[12.22222222,12.22222222]
sprintf没有重新输入 t:
根据此discussion,在AVRFreaks上,sprintf is not re-entrant.
(讨论是关于在启用了中断的硬件环境中使用sprintf的。)这意味着如果在sprintf
操作之间发生中断,则堆栈无法继续其正在执行的操作。
由于我的MCU是32位的,因此要执行64位的操作将需要两个时钟周期。如果根据上述讨论,假设sprintf操作之间发生中断,则sprintf
应该会失败。
问题
1. sprintf
是否会因中断而失败?
这里是字符串函数,一个中断例程也在后台运行,该例程处理其他传感器数据(本地和全局)
/* @brief From the array of GPS structs we create a string of the format
* [[lat,long],[lat,long],..]
* @param input The input array of GPS structs
* @param output The output string which will contain lat, long
* @param sz Size left in the output buffer
* @return 0 Successfully completed operation
* 1 Failed / Error
*/
int get_gps60secString(GPS_periodic_t input[GPS_PERIODIC_ARRAY_SIZE],
char *output, size_t sz)
{
int cnt = snprintf(output, sz, "[");
if (cnt < 0 || cnt >= sz)
return 1;
output += cnt;
sz -= cnt;
int i = 0;
for (i = 0; i < GPS_PERIODIC_ARRAY_SIZE; i++) {
cnt = snprintf(output, sz, "[%0.8f,%0.8f]%s",
input[i].point.latitude, input[i].point.longitude,
i + 1 == GPS_PERIODIC_ARRAY_SIZE ? "" : ",");
if (cnt < 0 || cnt >= sz)
return 1;
output += cnt;
sz -= cnt;
}
cnt = snprintf(output, sz, "]");
if (cnt < 0 || cnt >= sz)
return 1;
return 0; // no error
}
中断例程
void GPS_InterruptHandler(UART_HandleTypeDef *UartHandle)
{
gps_UART_RxInterrupt_Disable();
GPS_t l_sGpsInfo;
memset(&l_sGpsInfo,0,sizeof(GPS_t));
status=Validate_get_gpsInfo((char*)g_gps_readBuff,&l_sGpsInfo,100);
MEMS_interruptHandler(); //Inertial sensor ISR
gps_UART_RxInterrupt_Enable();
}
答案 0 :(得分:0)
sprintf
仅在中断期间失败,如果在该中断期间再次调用它(假设它使用了可重用的全局变量;它将仅使用堆栈变量,然后又可重入)。 / p>
因此,如果您的中断处理程序正在调用sprintf
,并且在该调用期间发生了新的,相同或更高优先级的中断,则中断可能会失败。但是,在处理中断期间,通常会禁用中断,因此不会(不应!)发生另一次相同类型的中断。
但是为什么在中断处理期间转换原始数据呢?为什么不通过缓冲区将这些数据存储/传递给用户级例程,并使该功能转换原始数据呢?这与中断处理程序应尽可能短(快速)的想法是一致的。