
根据您的描述,问题可能涉及RT-Thread Studio的编译器优化、内存初始化或硬件时序问题。以下是详细分析和解决方案:
编译器优化差异(主要嫌疑)
-Og),而Keil使用ARMCC(优化等级-O0)r37 = HAL_ADC_GetValue(&hadc1) * 3.3f / 4096; // 浮点运算在复位后可能未重新初始化内存未初始化问题
float r37; // 全局变量在软件复位后可能保留旧值硬件初始化时序
线程栈溢出
在RT-Thread Studio的工程设置中:
项目属性 → C/C++构建 → 设置
→ 工具设置 → 优化等级:改为 -O0(无优化)
→ 额外编译标志:添加 -fsigned-char -fno-strict-aliasing在main()函数开头添加硬件复位标志:
// main.c
SystemInit(); // 确保调用系统初始化
// 添加硬件复位处理
if (__HAL_RCC_GET_FLAG(RCC_FLAG_SFTRST)) {
HAL_DeInit(); // 重置所有外设
HAL_RCC_DeInit();
__HAL_RCC_CLEAR_RESET_FLAGS(); // 清除复位标志
SystemClock_Config(); // 重新配置时钟
MX_GPIO_Init(); // 重新初始化GPIO
MX_ADC1_Init(); // 重新初始化ADC
// 显示设备重新初始化
LCD_Init();
}在创建线程时指定更大的栈(至少1.5KB):
rt_thread_t tid = rt_thread_create("b1see", b1see, RT_NULL,
1536, // 栈大小改为1.5KB
25, // 优先级
10); // 时间片确保硬件初始化完成后再启动线程:
// main.c
int main(void) {
// ...硬件初始化...
// 添加500ms延迟确保外设稳定
rt_thread_mdelay(500);
rt_thread_startup(tid); // 启动线程
}修改ADC读取代码,避免优化问题:
// 使用volatile防止优化
volatile uint32_t adc_raw = HAL_ADC_GetValue(&hadc1);
r37 = (float)adc_raw * (3.3f / 4096.0f);
// 或改用整数运算(推荐):
int raw_val = HAL_ADC_GetValue(&hadc1);
int voltage_mv = raw_val * 3300 / 4096; // 单位:毫伏
特别注意:调试模式(Debug)会强制初始化寄存器,因此问题可能只在独立运行时出现。上述解决方案重点处理了复位时的寄存器/外设状态一致性。
如果问题仍然存在,建议在复位后立即暂停程序,检查:
r37变量的内存值
举报
更多回帖