OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 3364|回复: 4

关于FreeRTOS中i2c的us级延时和任务划分

[复制链接]

11

主题

34

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
321
金钱
321
注册时间
2021-11-28
在线时间
39 小时
发表于 2022-6-2 10:03:11 | 显示全部楼层 |阅读模式
1金钱
关于FreeRTOS小白提问:
1、FreeRTOS里面的时钟默认我看是设置成1ms(#define configTICK_RATE_HZ                                ( ( TickType_t ) 1000 )),
也就是1ms切换任务,那如果我要用I2C如何实现us级别的延时呢?
2、如果我找到了us级的延时,是否是读写i2C时程序循环等待i2C的时序,这和操作系统轮流使用CPU的思路对应不上呢?
3、如果我有这样的需求:读个i2c数据,根据数据PWM方式控制IO,再读i2C和AD,业务逻辑后输出DA、输出到串口数据、输出到I2C,我大致如何建任务呢?


最佳答案

查看完整内容[请看2#楼]

对于IIC、SPI总线的操作不要用FreeRTOS的延时节拍API函数,要么用NOP()指令,要么用正点原子提供了us的延时函数。 正点原子提供了us的延时函数 //延时nus //nus:要延时的us数. //nus:0~204522252(最大值即2^32/fac_us@fac_us=168) void delay_us(u32 nus) { u32 ticks; u32 told,tnow,tcnt=0; u32 reload=SysTick->LOAD; //LOAD的值 ticks=nus*fac_us; //需要的节拍数 to ...
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

19

主题

334

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1108
金钱
1108
注册时间
2018-11-6
在线时间
240 小时
发表于 2022-6-2 10:03:12 | 显示全部楼层
对于IIC、SPI总线的操作不要用FreeRTOS的延时节拍API函数,要么用NOP()指令,要么用正点原子提供了us的延时函数。

正点原子提供了us的延时函数

//延时nus
//nus:要延时的us数.       
//nus:0~204522252(最大值即2^32/fac_us@fac_us=168)                                                                              
void delay_us(u32 nus)
{               
        u32 ticks;
        u32 told,tnow,tcnt=0;
        u32 reload=SysTick->LOAD;                                //LOAD的值                     
        ticks=nus*fac_us;                                                 //需要的节拍数
        told=SysTick->VAL;                                        //刚进入时的计数器值
        while(1)
        {
                tnow=SysTick->VAL;       
                if(tnow!=told)
                {            
                        if(tnow<told)tcnt+=told-tnow;        //这里注意一下SYSTICK是一个递减的计数器就可以了.
                        else tcnt+=reload-tnow+told;            
                        told=tnow;
                        if(tcnt>=ticks)break;                        //时间超过/等于要延迟的时间,则退出.
                }  
        };                                                                                    
}  
回复

使用道具 举报

4

主题

881

帖子

0

精华

论坛元老

Rank: 8Rank: 8

积分
4201
金钱
4201
注册时间
2019-9-4
在线时间
882 小时
发表于 2022-6-2 10:13:42 | 显示全部楼层
1、你看下里面有没有嘀嗒定时器的延时,应该有us级的延时函数。做时序的延时操作的时候不要用RTOS的延时函数,会把调度放出来的,容易造成时序错误。
2、时序操作就不要想着把调度放出去了,容易造成时序错乱的情况的。
3、大概就是搞个标志位做状态来判断吧。
回复

使用道具 举报

16

主题

189

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1296
金钱
1296
注册时间
2013-8-27
在线时间
503 小时
发表于 2022-6-2 10:31:30 | 显示全部楼层
直接用空指令延时_NOP_();只要你不主动释放CPU控制权,系统调度不会直接切换出去的
回复

使用道具 举报

19

主题

334

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1108
金钱
1108
注册时间
2018-11-6
在线时间
240 小时
发表于 2022-6-16 16:06:28 | 显示全部楼层
1、可以修改 #define configTICK_RATE_HZ                                ( ( TickType_t ) 1000 ))
为1us   --->     ( ( TickType_t ) 1 ))
    但是没有必要。

2、I2C,SPI总线的时序还是用NOP()指令吧!
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2024-11-25 13:32

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

快速回复 返回顶部 返回列表