当前位置:首页 > 公众号精选 > wenzi嵌入式软件
[导读]微秒级延时设计方案一般RTOS系统时钟1KHz的情况下,thread_sleep()的最短时间是1ms。在实时控制中有些情况需要微秒(us)级延时,这该怎么办呢?微秒级延时有两种实现思路:一是着情提高系统时钟,二是使用MCU的高精度定时器。一、着情提高系统时钟之所以说是“着情”提...

微秒级延时设计方案

一般 RTOS 系统时钟 1KHz 的情况下,thread_sleep() 的最短时间是 1ms。在实时控制中有些情况需要微秒(us)级延时,这该怎么办呢?

微秒级延时有两种实现思路:一是着情提高系统时钟,二是使用 MCU 的高精度定时器。

一、着情提高系统时钟

之所以说是“着情”提高的原因是:系统时钟越快,单位时间内的线程调度次数越多,也就是说花在调度的时间会大幅增加,这对线程的功能不利。真正做事的是线程函数,如果 CPU 会说话,过快的线程调度将会引起 CPU 的极度不满。线程是 CPU 具体要做的事,刚把 CPU 调过来做事,事没做完就拉跑做另一件事,CPU 会说:“傻瓜,疯了吗?不是让我做事的码,干嘛老是拉着我跑这跑那,就不能让我干完了再走码?!”

二、使用 MCU 片上外设定时器

一般 MCU 都会有片上高精度定时器外设,可以配置到 1us 精度。即然用定时器可以,那就用定时器呗,还写什么文章?当然不只是开启定时器这么简单,RTOS 要实现的是阻塞延时,任务进入延时要交出 CPU 使用权进入阻塞状态。在 RTOS 上用定时器躺平死等是无赖行为,睡眠让权才能实现良好的多线程调度。

虽然 us 级延时时间短,在一个线程处于延时中时另一个线程又要开始延时的情况发生概率不大。但是在多线程情况下延时依旧有可能发生重入,比如一个线程要延时 500us,刚过 100us 另一个线程就要延时 200us,这种情况不但发生了重入,还有“时间覆盖”(200us 覆盖了上一个线程剩余的 400us 里的时间段),这些情况也不是光靠一个硬件高精度定时器就能应对的。

多线程延时工况分析

先来看一张多线程延时工况图,如“图1”所示:


图1. 多线程延时工况01


为了方便阅读以及接下来进一步的设计实现,Sugar 在上图基础上加了一些注释,对多线程的工况进行更细致一点的描述,如“图2”所示:


图2. 多线程延时工况02


为了更好说明 Sugar 选用最近长势正盛的 Microsoft Azure RTOS ThreadX 做基础来实现这个设计。目的在于输出通用方法,具体选什么 RTOS 并不重要,是个多线程就行,比如:RT-Thread、FreeRTOS 等都可以。

图中的 A、B、C 和 High-precision Timer 是 4 个线程。其中 High-precision Timer 线程优先级最高,但不是定时回调的,而是被动触发。下面说说为什么 High-precision Timer 线程优先级要最高,以及如何被动触发。

我们知道线程中用 WAIT_FOREVER 方式等待信号量的时候,若信号量的值为 0 则线程会被挂起在这个信号量下。我们就利用这个特点来完成线程的“被动触发”,即:

1、信号量建立时初值为 0

2、在中断中释放一次信号量(即信号量值加 1)

这样中断发生后就能立刻唤醒挂起在该信号量下的线程,即完成了线程的被动触发。线程转为就绪态后,因其优先级最高,会立即抢占调度器得到执行。在 Hight-precision Timer 线程被信号量唤醒后,立即对延时时间到的线程进行 resume 操作,这样就完成了线程的 us 延时。

我们回看一下上面图中的 A、B、C 三个线程,每条线上都串了两个圈圈,每条线从上往下第一个圈是延时主动挂起,第二个圈是时间到后被 High-precision Timer 线程 resume 回来继续执行。

至此读图的方法基本说清楚了,如果要落实到代码,其实还有个“硬件定时器与 High-precision Timer 线程”的关系。图中标在 High-precision Timer 左边的标签是说:因为硬件定时器产生了中断,才使得 High-precision Timer 线程对延时时间到的线程进行 resume。上面说“被动触发”的时候有说到相关原理,其实上面图的最右边应该再放一列表示“硬件定时器”就更好理解原理了。没有放的原因是这里要考虑“可重入”,这个瓜有点多,一车装不下,装少了说不完善,装多了眼花缭乱,所以就没画“硬件定时器”这一列。

代码实现

为了实现上述设计的阻塞延时,代码要划分为四个部分:

一、 要配置一个 us 级定时器;

二、 要做一个 us 延时的函数接口;

三、 要有一个 High-precision Timer 线程;

四、 要有一个测试用 us 级的普通定时回调线程。

下面 Sugar 以 STM32 为例逐一上代码。

us 级定时器配置

1、 定时器初始化
这里直接使用 CubeMX 生成的函数最方便,一行不改,如下:

/** * @brief TIM9 Initialization Function * @param None * @retval None */static void MX_TIM9_Init(void){
/* USER CODE BEGIN TIM9_Init 0 */
/* USER CODE END TIM9_Init 0 */
TIM_ClockConfigTypeDef sClockSourceConfig = {0};
/* USER CODE BEGIN TIM9_Init 1 */
/* USER CODE END TIM9_Init 1 */ htim9.Instance = TIM9; htim9.Init.Prescaler = 215; htim9.Init.CounterMode = TIM_COUNTERMODE_UP; htim9.Init.Period = 65535; htim9.Init.ClockDivision = TIM_CLOCKDIVISION_DIV1; htim9.Init.AutoReloadPreload = TIM_AUTORELOAD_PRELOAD_DISABLE; if (HAL_TIM_Base_Init(
本站声明: 本文章由作者或相关机构授权发布,目的在于传递更多信息,并不代表本站赞同其观点,本站亦不保证或承诺内容真实性等。需要转载请联系该专栏作者,如若文章内容侵犯您的权益,请及时联系本站删除。
换一批
延伸阅读

9月2日消息,不造车的华为或将催生出更大的独角兽公司,随着阿维塔和赛力斯的入局,华为引望愈发显得引人瞩目。

关键字: 阿维塔 塞力斯 华为

加利福尼亚州圣克拉拉县2024年8月30日 /美通社/ -- 数字化转型技术解决方案公司Trianz今天宣布,该公司与Amazon Web Services (AWS)签订了...

关键字: AWS AN BSP 数字化

伦敦2024年8月29日 /美通社/ -- 英国汽车技术公司SODA.Auto推出其旗舰产品SODA V,这是全球首款涵盖汽车工程师从创意到认证的所有需求的工具,可用于创建软件定义汽车。 SODA V工具的开发耗时1.5...

关键字: 汽车 人工智能 智能驱动 BSP

北京2024年8月28日 /美通社/ -- 越来越多用户希望企业业务能7×24不间断运行,同时企业却面临越来越多业务中断的风险,如企业系统复杂性的增加,频繁的功能更新和发布等。如何确保业务连续性,提升韧性,成...

关键字: 亚马逊 解密 控制平面 BSP

8月30日消息,据媒体报道,腾讯和网易近期正在缩减他们对日本游戏市场的投资。

关键字: 腾讯 编码器 CPU

8月28日消息,今天上午,2024中国国际大数据产业博览会开幕式在贵阳举行,华为董事、质量流程IT总裁陶景文发表了演讲。

关键字: 华为 12nm EDA 半导体

8月28日消息,在2024中国国际大数据产业博览会上,华为常务董事、华为云CEO张平安发表演讲称,数字世界的话语权最终是由生态的繁荣决定的。

关键字: 华为 12nm 手机 卫星通信

要点: 有效应对环境变化,经营业绩稳中有升 落实提质增效举措,毛利润率延续升势 战略布局成效显著,战新业务引领增长 以科技创新为引领,提升企业核心竞争力 坚持高质量发展策略,塑强核心竞争优势...

关键字: 通信 BSP 电信运营商 数字经济

北京2024年8月27日 /美通社/ -- 8月21日,由中央广播电视总台与中国电影电视技术学会联合牵头组建的NVI技术创新联盟在BIRTV2024超高清全产业链发展研讨会上宣布正式成立。 活动现场 NVI技术创新联...

关键字: VI 传输协议 音频 BSP

北京2024年8月27日 /美通社/ -- 在8月23日举办的2024年长三角生态绿色一体化发展示范区联合招商会上,软通动力信息技术(集团)股份有限公司(以下简称"软通动力")与长三角投资(上海)有限...

关键字: BSP 信息技术
关闭
关闭