STM32单片机中C语言的一些隐藏bug

必须类型一致的判断才能正常

c 复制代码
double a=-0.4;
if(a < -0.2){
	print("低电平");
}

这段代码可能未必如你所愿的运行. < 小于号的判断一定要类型一致, 尤其是牵扯到双精度类型的判断... 一定要保证符号 两边的数据类型一致才有可能得到你想要的结果. 代码里 -0.4 默认可能是float类型. 有的编译器默认是double类型. 一定要测试过才行.

不要使用 malloc函数获取内存

c 复制代码
float* aa= (float*)malloc(1000 * sizeof(float));
float* bb= (float*)malloc(1000 * sizeof(float));
float* cc= (float*)malloc(1000 * sizeof(float));

for (i = 0; i < signal->size; i++) 
{ 
    sindata[i] = sin(aa[i]);
    cosdata[i] = cos(aa[i]); 
    printf("%d  at Phase %f  sin is %f, cos is %f \r\n",i,referencePhase, referenceSin[i] , referenceCos[i] ); 
}

如果是这样的代码, 在PC上基本上是不会出什么问题, 如果是在STM32单片机上. 这么写估计会跑出来一大堆的问题.

为了这个问题我调试了大半天. 最终的原因在 动态分配内存 malloc() 函数上, 不一定能正确获得存储空间.

期初以为是float的精度不一致的问题, 逐行 printf 对比后才发现. 是malloc() 的问题.

改成

c 复制代码
float aa[1000]= {0};
float bb[1000]= {0};
float cc[1000]= {0};

for (i = 0; i < signal->size; i++) 
{ 
    sindata[i] = sin(aa[i]);
    cosdata[i] = cos(aa[i]); 
    printf("%d  at Phase %f  sin is %f, cos is %f \r\n",i,referencePhase, referenceSin[i] , referenceCos[i] ); 
}

把存储数据的变量改成全局静态的. 基本上不会出错.

不要在函数中初始化变量,尤其是大的数组变量.

c 复制代码
int main()
{  
    double signalData[2000];
    generateMultiSignal(signalData, 2000); 
    ...
}

这段代码中signalData 犯了2个错误,

1.在main函数中定义,

2.这里只是声明一个数组变量, 并非是初始化一个数组变量.

改成下面这么写就没问题了.

c 复制代码
double signalData[2000]={0};
int main()
{  
    generateMultiSignal(signalData, 2000); 
    ...
}

强制类型转换会丢失一个数值

c 复制代码
float anglea = 6.2900;
int indexb = (int)(anglea * 100);
printf("indexbbb: %d, angle: %f\n",  indexb, anglea);

理论上应该得到的是

indexbbb: 629, angle: 6.2900

但实际上得到的是

indexbbb: 628, angle: 6.2900

比实际值少了一个1?

c 复制代码
float anglea = 6.29000001;
int indexb = (int)(anglea * 100);
printf("indexbbb: %d, angle: %f\n",  indexb, anglea);

这样输出的值就是正常的. 具体原因不知.

开启DSP加速. 引用的lib库文件一定要正确.

引用 arm_cortexM4l_math.lib 时

c 复制代码
arm_sin_f32(123456)  

输出123456

正确的lib库应该是用 lf 的浮点库.

arm_cortexM4lf_math.lib

害我找了1天的bug啊...

另外如何开启DSP加速, 请参考下面的几篇文章

https://blog.csdn.net/WandZ123/article/details/125593908

https://zhuanlan.zhihu.com/p/462911261

https://blog.csdn.net/m0_74923693/article/details/136857288

printf 必须数据格式一致

c 复制代码
double age =18.0;
printf("age %f \r\n", age);

这会输出

age 0.00

正确代码如下

c 复制代码
double age =18.0;
printf("age %f \r\n", (float)age);
相关推荐
糖糖单片机设计19 分钟前
基于 STM32 的智能净水器系统
stm32·单片机·嵌入式硬件
zcmodeltech22 分钟前
火电厂模型能演示冷态启动和故障处理吗?——基于STM32与Modbus RTU的集控实训控制系统设计
数据结构·stm32·单片机·嵌入式硬件·能源
llilian_1631 分钟前
标准时间间隔发生器应用解决方案 脉冲发生器 时间测量仪
大数据·网络·人工智能·功能测试·单片机·嵌入式硬件·51单片机
桀人44 分钟前
STM32之GPIO四种输出模式——P-MOS和N-MOS管的工作原理——双二极管钳位保护电路——上拉电阻
stm32·单片机·嵌入式硬件
HRTOS1 小时前
HRTOS 4.0 DEBUG:面向 8051 实时系统运行状态的轻量级调试组件
单片机·嵌入式硬件·51单片机
零依赖极客1 小时前
Day 8·1 自注意力机制:Q·K^T/softmax/V的在线计算
c语言·arm开发·人工智能·llama
LCG元1 小时前
STM32F407 I2S驱动WM8978音频播放实战:PLLI2S时钟整定、DMA双缓冲防爆音与WAV采样率实测
stm32·嵌入式硬件·音视频
ZLG_zhiyuan2 小时前
明明加了隔离,电源为啥还是烧了?
单片机
fhq_fn_jgd2 小时前
51单片机(中断,定时器)
stm32·单片机·嵌入式硬件
zhangzhangkeji2 小时前
stm32 笔记 - 2:库函数方式的初始化,项目的文件结构
stm32·arm