yangjie
yangjie - 认证专家
This guy hasn't written anything yet

注册于 3 years ago

回答
378
文章
2
关注者
14

你看一下rt_i2c_master_send()和rt_i2c_master_recv()函数中已经做了防止读写错误的处理,强制置位flag分别为读和写了

Mculover666 发表于 2018-10-25 14:51
帖子是用md写的,手机看格式会乱,电脑端查看正常


看不到哦,图片应该在你本地,没有插入上传上来呢

flyghost 发表于 2018-10-23 17:06
我把他改为软定时也是同样的情况,所有定时器加在一起的时间一般在几十us左右,偶尔会达到一百多us,这个 ...


超时函数中没有进行保护,也没有获取信号量、互斥量等操作吧?

i2c初始化在drv_i2c.c中有的,使用了INIT_DEVICE_EXPORT(drv_i2c_init);进行自动初始化,不需要自己初始化
使用的时候需要将drv_i2c.c中对应的i2c底层硬件PIN脚设置一下
用户I2C设备名称,必须和drv_i2c.c注册的I2C设备名称(I2C_BUS_NAME)一致

    本帖最后由 yangjie 于 2018-10-23 16:53 编辑


定时器分为HARD_TIMER与SOFT_TIMER,如果创建的时候没有指定那就是默认HARD_TIMER。HARD_TIMER超时函数是在系统时钟中断的上下文环境中运行的,在中断上下文中的执行方式决定了定时器的超时函数不能够执行非常长的时间,否则会导致其他中断的响应时间加长

    本帖最后由 yangjie 于 2018-10-23 10:44 编辑


fengye 发表于 2018-10-22 23:42
读写都出错

确保系统已经注册了“i2c1”

在写完之后不能马上读,中间一定要延时。
参考https://www.rt-thread.org/qa/thread-3471-1-1.html



在进行任务切换的时候,有可能会来一个中断,在任务切换完之后,开中断,执行中断,中断运行完之后,再运行线程。可以看看rt_schedule。

原来信号量值=5,线程release一次是给信号量的值+1
桌子上有5个苹果,别人每放进来一个(release),桌子上苹果就多一个;别人从桌子上拿走(take)一个,桌子上苹果就少一个,take完了就take不到了,但是可以一直release。

这里如果你想要的效果是:初始化只有5个车位,只能申请5次,完后也只能释放5次的话,需要初始化两个信号量相互牵制。
可以参考







    本帖最后由 yangjie 于 2018-9-21 15:21 编辑


正点原子探索者来报到~~

回到
顶部

发布
问题

投诉
建议