编程日志
FreeRTOS移植
- 有时任务卡死可能是因为堆栈空间不足
- 延时时间长短影响程序调用周期,影响实际体验
- 按键key被配置成输出模式,造成实验无现象。
2020.10.08编写MPU9250读取例程
- 移植例程时,漏掉一个lib库。原因是,这个lib库是压缩包形式,在移植时以为是冗余文件所以没有添加
- 延时函数问题,源程序使用自己定义的延时函数,移植时为了方便直接替换成了HAL_Delay。忽略了一个重要因素,它自己定义的延时函数是us级别的,而HAL_Delay()是ms级别的
- 模拟I2C使用某一引脚,在不同时刻输入输出模式不同,源程序采用寄存器配置方式。我对寄存器的知识掌握不到位,所以配置错误了。学长的解决方法是,自己定义一个同名函数,用HAL库改写
- 把函数体写在头文件中,结果被不同文件包含后,判作重定义
- 有些标准库定义的函数和HAL库长得很像,但是大小写却不同,所以keil报错时不容易发现。
- 从不同工程移植过来的文件使用的函数名不同,造成同一作用的函数被重复定义,造成代码冗余
- 因为使用cubeMX更新代码,把一些不规范的代码剔除掉,结果少了初始化函数,函数执行移植没结果。
10-12模拟I2C读取温湿度值
- 源程序采用程序延时,采用for循环延时。但是延时的时间太短,读取到的值是错的。最后,增大了延时循环次数,才获取到正确的实验值。
- 参考别人的程序,使用printf函数,打印出乱码。后来发现原因是别人程序的编码是utf-8,这种编码在打印中文时会出现乱码。采用记事本打开,另存时,更改编码方式就可以解决了。
- 在使用LCD显示时,中文的字号32表示是 32*32 的矩阵。但是数字或英文的32字号,则是32 * 16 的 矩阵!
10-17MQTT连接云平台
- 这是一次天坑的实验,希望以史为鉴,不要再犯类似错误了!
- 实验还是在原有例程的基础上移植的,原本进展很顺利,我先是把原来的标准库例程做了一些修改(其实就是修改一下WiFi参数,连接云平台的配置,最后修改了json数据包格式),修改成功后开始移植。但是移植的过程中一直出错,更惨的是,我没有做好历史备份,直接在原有例程的基础上修改,同时不同版本的程序也没有用后缀名加以区分。结果是我很快把原本能跑通的程序改的面目全非。(这里提醒:一定,一定,一定,做好历史版本的备份,并且用后缀名加以区分)
- 要做一份较为综合的程序时,如果不是很有把握,首先应该设计一下,编程思路。然后照着思路,分功能分模块实现,最后将各功能代码合起来。这样避免一下子全做出来,不知道错在哪里。
- 这次实验还出现了很多硬伤:
- 程序写的位置不规范,使用cubemX重写配置文件时,直接覆盖,更绝的是,这次覆盖的是初始化函数,虽然不会报错,但是一运行就出错!
- 实验时WiFi板子未插,导致实验初始化一直没通过,然后我还一直发现不了!气死了!
- 使用新的通信板时,不知道上面还有一个拨码开关,没有开,结果和上条一样!
- 一直程序时,不同程序的类似变量用了不同名称,当时有点强迫症,直接用replace全部替换了(这是一个巨坑,千万别图省事,全部替换**。一定要花时间弄懂变量的关系,命名变量时也要有规律,有标识度,懒省事的后果是花百倍的时间弥补**),结果造成变量的逻辑混乱,内存出错,检查好久才改正!
- 使用cJSON库,构建cJSON对象,不delate对象或字符串的话,过一会内存满了,程序就会运行出错!
- 移植时,源程序使用到了串口中断,新程序没有用,但是没有把中断的代码剔除干净(原代码耦合性较高),造成内存出错
- 对keil使用不熟练,很多高级功能不会用,太耗时间