你的浏览器版本过低,可能导致网站不能正常访问!
为了你能正常使用网站功能,请使用这些浏览器。

【我与STM32共成长】一路上有你

[复制链接]
yusp75 提问时间:2017-1-24 16:42 /
我用的是STM32F103做了一个小控制项目,无一例外涉及到输入,输出和显示。
从开始就没打算用寄存器操作进行编程,直接选择了Stm32CubeMX配置项目模板,使用HAL库函数编程,F1库已经很完善,也没遇到什么Bug。
但是HAL库一直没有找到一个正式的使用手册,只能翻阅CHM帮助。 如果对寄存器熟悉,使用HAL库函数,能更好理解并使用。
使用STM32F1的硬件IIC,使用HAL函数,读写SD3088时钟芯片,运行几个月,没发现IIC死锁的问题,刚开始时很担心这个问题。
STM32的HAL库,使用起来始终没有arduino那样平易近人,mbed在朝这个方向努力,但没有提出一个明确的移植指南。STM32产品很多,内存和外围设备变化多端,网站上的板子导入后,export后需要修改文件来适应自己的MCU片子,移植没有ST的官方确认。ST可以考虑提供经过验证的移植。
C++编程,对于变量管理很方便,但Stm32CubeMX还只能导出C语言的项目框架。


还是希望ST能把STM32的库进一步封装,隐藏底层硬件信息。

自己做的是壁炉控制系统,使用的是1.3寸的OLED屏,做人机交互时,选择了m2tklib,这个库是为文本LCD开发的,主要是给arduino服务,后来才有了ARM支持。也想使用stemwin,初期移植不明白,过几天再试试。
使用的是IAR编译器,遇到一个典型问题:结构体对齐。 这也算是2016做开发一个体验,关于对齐,网上也有文字提过,但多数是考虑STM32是32位MCU,一次读取32Bit(4字节)效率最高。

Stm32CubeMX支持的RTOS是FreeRTOS,编程时我直接按CMSIS封装的函数格式来写。使用osMessagePut,osMessageGet来进行结构体的发送和接受,使用了定长的内存池。
typedef struct
{

  bool fan_smoke_is_on;  
  bool fan_exchange_is_on;
  //uint8_t dummy_0;
  //uint8_t dummy_1;  

  uint16_t fan_smoke_power;  
  uint16_t fan_exchange_power;

} T;


由于使用memory pool,所以就会有Free操作:osPoolFree。
上面这个结构体没有红色部分时,系统运行时,会随机性死机,然后就开始考虑野指针问题。开始也不知道哪里的指针不对啊,就把怀疑的地方注释,等注释到osPoolFree后,不死机了。

比较昨天的代码,发现这个结构体自己修改了成员,然后就考虑是结构体未对齐4字节,释放指针所指内存时,把其他的数据也给修改了。
我这个对齐问题,编译时没有警告。

加上两个dummy数据,程序就正常了,隐约记得看u8g的源代码里也有dummy成员,应该也是对齐考虑。
开始比较迷信IAR优化代码好,结果被stack和heap折腾一通,还是GCC编译器自动管理方便。

收藏 1 评论1 发布时间:2017-1-24 16:42

举报

1个回答
Unbelievable 回答时间:2017-2-13 16:28:50
感谢分享

所属标签

相似问题

关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
STM32Cube扩展软件包
意法半导体边缘AI套件
ST - 理想汽车豪华SUV案例
ST意法半导体智能家居案例
STM32 ARM Cortex 32位微控制器
关注我们
st-img 微信公众号
st-img 手机版