移植代码到RT-Thread上的遇到的问题记录

移植得先看懂代码,代码看了挺久,逐步逐步移植到RT-thread上。有时候遇到问题,第二天才解决。大的问题不多,但还是遇到了许多问题。

一、RT-thread启动过程

1、因为程序必须要用到IAP方式下载程序,程序还要设置地址偏移(NVIC.SetVector Table(NVIC_VectTab_FLASH,Ox8000)),以前学的是uC/OS系列的RTOS,然而RT-Thread的启动过程与其他RTOS启动过程不一样,通常我们使用的main函数不是它执行的第一个函数,在执行main函数之前RT-Thread已经启动,启动之后再设置flash地址偏移就肯定导致程序崩溃。

二、微秒级延时(模拟IIC)

发现加上操作AT24C02代码程序就卡死以及测试发现显示不了光源使用时间等,后来发现AT24C02用到的模拟IC有用到滴答定时器做微秒延时,而滴答定时器已经用来做系统节拍所以导致程序卡死,官方更新版本的源码中提供了一个基于读滴答定时器值的方式实现的us延时函数,将之前的微秒函数替换成该函数就就解决了。还要注意的问题是因为用到的模拟IC,为防止任务切换打断时序,所以用调度器加锁的方式保护这段代码不能被打断。

三、OS tick的问题

1、默认的OS tick是1ms,一般推荐配置是10ms,这个时间有点快,改成10ms后,发现做完步进电机部分程序移植即步进电机的原来的延时函数换成了操作系统的延时函数(会引起任务切换)后步进电机运行不流畅。猜测应该是因为时钟节拍不够快从而影响步进电机的时序所以导致其不流畅,将OS tick改回1ms就没问题了。

2、默认的OS tick是1ms,在main函数中一创建其他线程程序就崩溃,猜测可能是因为OS tick太小,程序切换块打断了线程创建的过程导致程序崩溃,以为电机所以OS tick要设置成1ms不能改成其他的。因此想到加上临界区保护(关中断,禁止调度),果然在线程创建函数之间加上临界区保护之后就解决了。

四、代码耦合度

原来光源程序用到很多全局变量,程序各个模块之间耦合度很高,所以移植到操作系统后耦合度还是有点高,细分任务降低耦合度有点复杂

你可能感兴趣的:(RT-Thread)