rtt从设计上、框架上、各种模块支持性上都应该国内领先了,必须表扬下。但是,我感觉并不好用,更有莫名的不稳定,比如随便想一个:
1 文件写write SD卡,会有一个不大不打小的概率会失败,磁盘太重要了,这问题我往哪里找啊!
2 i2c 的读写动作,网上清一色的绕过rt_device_write,都是直接调用的i2c虚拟驱动层的函数,这么个重要且小的问题愣是不解决!搞的我自己扩展了内核,又在设备层之上做了个api读写接口,如下:
include "i2c_if.h"
int i2c_if_read( rt_device_t i2c_dev,
uint16_t slave_addr,
uint16_t addr,
uint16_t addr_len, // number of bytes, 1 or 2
void *buf, int len)
{
int ret;
rt_off_t pos_flag, pos = slave_addr >> 1;
if (addr_len == 2) addr = (addr >> 8) | (addr << 8);
struct rt_i2c_bus_device *bus = (struct rt_i2c_bus_device *)i2c_dev->user_data;
RT_ASSERT(bus);
rt_mutex_take(&bus->lock, RT_WAITING_FOREVER);
pos_flag = pos | (RT_I2C_NO_STOP << 16);
if ((ret=rt_device_write(i2c_dev, pos_flag, &addr, addr_len)) == addr_len) {
pos_flag = pos | (RT_I2C_FORCE_RESTART << 16);
ret = rt_device_read(i2c_dev, pos_flag, buf, len);
}
rt_mutex_release(&bus->lock);
return ret;
}
int i2c_if_write( rt_device_t i2c_dev,
uint16_t slave_addr,
uint16_t addr,
uint16_t addr_len, // number of bytes, 1 or 2
const void *buf, int len)
{
int ret;
rt_off_t pos_flag, pos = slave_addr >> 1;
if (addr_len == 2) addr = (addr >> 8) | (addr << 8);
struct rt_i2c_bus_device *bus = (struct rt_i2c_bus_device *)i2c_dev->user_data;
RT_ASSERT(bus);
rt_mutex_take(&bus->lock, RT_WAITING_FOREVER);
pos_flag = pos | (RT_I2C_NO_STOP << 16);
if ((ret=rt_device_write(i2c_dev, pos_flag, &addr, addr_len)) == addr_len) {
pos_flag = pos | (RT_I2C_NO_START << 16);
ret = rt_device_write(i2c_dev, pos_flag, buf, len);
}
rt_mutex_release(&bus->lock);
return ret;
}
基本的file I2c uart net socket io,一定要好用且稳定,必须是傻瓜式的。否则,带给用户的全是担心和不信任。
rtt从设计上、框架上、各种模块支持性上都应该国内领先了,必须表扬下。但是,我感觉并不好用,更有莫名的不稳定,比如随便想一个:
1 文件写write SD卡,会有一个不大不打小的概率会失败,磁盘太重要了,这问题我往哪里找啊!
2 i2c 的读写动作,网上清一色的绕过rt_device_write,都是直接调用的i2c虚拟驱动层的函数,这么个重要且小的问题愣是不解决!搞的我自己扩展了内核,又在设备层之上做了个api读写接口,如下:
include "i2c_if.h"
int i2c_if_read( rt_device_t i2c_dev,
uint16_t slave_addr,
uint16_t addr,
uint16_t addr_len, // number of bytes, 1 or 2
void *buf, int len)
{
int ret;
rt_off_t pos_flag, pos = slave_addr >> 1;
if (addr_len == 2) addr = (addr >> 8) | (addr << 8);
struct rt_i2c_bus_device *bus = (struct rt_i2c_bus_device *)i2c_dev->user_data;
RT_ASSERT(bus);
rt_mutex_take(&bus->lock, RT_WAITING_FOREVER);
pos_flag = pos | (RT_I2C_NO_STOP << 16);
if ((ret=rt_device_write(i2c_dev, pos_flag, &addr, addr_len)) == addr_len) {
pos_flag = pos | (RT_I2C_FORCE_RESTART << 16);
ret = rt_device_read(i2c_dev, pos_flag, buf, len);
}
rt_mutex_release(&bus->lock);
return ret;
}
int i2c_if_write( rt_device_t i2c_dev,
uint16_t slave_addr,
uint16_t addr,
uint16_t addr_len, // number of bytes, 1 or 2
const void *buf, int len)
{
int ret;
rt_off_t pos_flag, pos = slave_addr >> 1;
if (addr_len == 2) addr = (addr >> 8) | (addr << 8);
struct rt_i2c_bus_device *bus = (struct rt_i2c_bus_device *)i2c_dev->user_data;
RT_ASSERT(bus);
rt_mutex_take(&bus->lock, RT_WAITING_FOREVER);
pos_flag = pos | (RT_I2C_NO_STOP << 16);
if ((ret=rt_device_write(i2c_dev, pos_flag, &addr, addr_len)) == addr_len) {
pos_flag = pos | (RT_I2C_NO_START << 16);
ret = rt_device_write(i2c_dev, pos_flag, buf, len);
}
rt_mutex_release(&bus->lock);
return ret;
}
基本的file I2c uart net socket io,一定要好用且稳定,必须是傻瓜式的。否则,带给用户的全是担心和不信任。
举报