每一种技术的出现必然是因为某种需求。正因为人的本性是贪婪的,所以科技的创新才能日新月异。
最近在学习树莓派的GPIO,想用Python来读取DHT11温湿度传感器的数据,DHT11是使用单总线通信的,需要用到微秒级的延时,使用sleep()函数好像没法达到要求,然后我发现时间戳可以精确到小数点后7位,也就是0.1微秒,虽然实际应该达不到这样的精度,但应该还是够用的。
这篇文章主要介绍Linux下时间处理的相关函数与操作。 比如: 系统时间设置,读取、RTC时间设置,读取、时间单位转换、延时函数、闹钟信号等等。
在之前的文章中,讲解中断处理相关的概念的时候,提到过有些任务不是紧急的,可以延后一段时间执行。因为中断服务例程都是顺序执行的,在响应一个中断的时候不应该被打断。相反,这些可延时任务执行时,可以使能中断。那么,将这些任务从中断处理程序中剥离出来,可以有效地保证内核对于中断响应时间尽可能短。这对于时间苛刻的应用来说,这是一个很重要的属性,尤其是那些要求中断请求必须在毫秒级别响应的应用。
C\C++标准库中提供了两种计时函数clock()和time()。其用法如下: (1)clock()函数用法
Linux2.6版本中引入了工作队列概念,代替Linux2.4版本中的任务队列。用以实现注册激活某些函数,留待稍后由工作线程执行(与tasklet的处理类似)。
是delay to do 还是delay doing 还是delay do?还是什么啊~~ 问下
延时函数,作为一种常用函数,在不同的领域有不同的用处。而在嵌入式以及C语言的编写中,我们常常遇到需要自己来编写延时函数的情况,这种情况之下,了解其原理就显得必要。
文章 < FreeRTOS 任务调度 任务切换 > 记录了 FreeRTOS 中任务切换的过程, 提到触发任务切换的两种情况 : 高优先级任务就绪抢占和同优先级任务时间共享(包括提前挂起)。 系统中,时间延时和任务阻塞,时间片都以 Systick 为单位。
SysTick定时器是存在于系统内核的一个滴答定时器,只要是ARM Cortex-M0/M3/M4/M7内核的MCU都包含这个定时器,它是一个24位的递减定时器,当计数到 0 时,将从RELOAD 寄存器中自动重装载定时初值,开始新一轮计数。使用内核的SysTick定时器来实现延时,可以不占用系统定时器,由于和MCU外设无关,所以代码的移植,在不同厂家的Cortex-M内核MCU之间,可以很方便的实现。而东芝的这款TT_M3HQ开发板使用的TMPM3HQFDFG芯片,正好是ARM Cortex-M3内核,所以以前使用的延时函数,可以直接拿过来使用,无需任何修改。
从通用计算的角度,操作系统是提供计算机基本功能的一组软件。操作系统保证了计算机硬件可以探测并响应外围器件(如键盘、屏幕、移动设备、打印机等),并管理内存空间和外部存储空间。
SysTick是滴答定时器,在相应的时间间隔内对变量进行操作(通过执行SysTick中断函数实现)。所以在比赛和学习中被组合成准确延时函数。
**************************************************************
SysTick定时器(又名系统滴答定时器)是存在于Cortex-M3的一个定时器,只要是ARM Cotex-M系列内核的MCU都包含这个定时器。使用内核的SysTick定时器来实现延时,可以不占用系统定时器,节约资源。由于SysTick是在CPU核内部实现的,跟MCU外设无关,因此它的代码可以在不同厂家之间移植。
发布者:全栈程序员栈长,转载请注明出处:https://javaforall.cn/151733.html原文链接:https://javaforall.cn
所需要了解的信息 1、每一条汇编指令需要占用几个时钟周期,方便计算多少时间 2、时钟周期为1M时,其倒数为时间1us
DS18B02芯片可以说是在蓝桥杯中是极为常考的一个芯片模块了,熟练掌握是必须的。 简单说明一下吧:温度读取时候呢?首先读出的是温度的低八位,其次读出的是温度的高八位,组成一个16位的二进制值就是DS18B20测量到的温度值。16位中的高5位代表着温度值的正负,一般环境下就没有必要考虑了,因为我们身边的环境温度都是高于零度的啦。最低的4位呢是小数位,需要显示小数位的时候就需要进行处理,没有这方面的要求时候可以直接忽略了。
一些初学者,以及刚工作不久的工程师都有这样的疑惑,今天就来分享一下这个话题:该不该用RTOS?
本节介绍的是有关LED灯的控制,也就是控制那8个小灯的熄灭与点亮,在这之前,先来补一下有关电路的一些知识点吧,LED模块原理图如下所示。
发布者:全栈程序员栈长,转载请注明出处:https://javaforall.cn/100139.html原文链接:
硬件定时器产生的周期性中断,中断频率就是系统频率(拍率)。系统拍率可以设置,单位是HZ,可在编译内核时通过图形化界面设置,设置路径如下:Kernel Features -> Timer frequency([=y])
在现实生活中,大多数我们所接触到的信号都是一种模拟信号,电压、电流、声音信号等。我们在嵌入式开发过程中,有时候会涉及到模拟信号的采集,在采集过程中,为了更好地还原出信号原本的样子,有这个一个采样定理,被称之为 Nyquist 采样定理,采样定理的内容是这样的:要从采样信号中不失真地恢复原始信号,那么采样频率应该大于原始信号最高频率的两倍,所以在编写程序中,我们为了能够从采样信号中不失真的恢复出原始信号,那么我们必须设置合适的采样率,下面笔者将不同地角度阐述几种确定采样率的方法,也就是确定采样周期。
Systick的四个寄存器: CTRL SysTick 控制和状态寄存器 LOAD SysTick 自动重装载除值寄存器 VAL SysTick 当前值寄存器 CALIB SysTick 校准值寄存器
本实验联系静态按键识别,发光二极管驱动,以及外部中断的使用方法,实验原理图如下图1所示(注:图中元件编号中括号里面的内容表示该元件所在的板子名称,如CPU 表示该元器件位于CPU 板,以下类同)。
RTOS 系统的核心就是任务管理,FreeRTOS 也不例外,而且大多数学习 RTOS 系统的工程师或者学生主要就是为了使用 RTOS 的多任务处理功能,初步上手 RTOS 系统首先必须掌握的也是任务的创建、删除、挂起和恢复等操作,由此可见任务管理的重要性。本文学习一下 FreeRTOS的任务基础知识,分为如下几部分:
首先,介绍下原理。下图为主控芯片和流水灯模块的原理图。流水灯模块接在单片机的P1口,由原理图可以知道,在P1口给一个低电平即可点亮LED灯。相反,如果要LED灯熄灭,就要把P1口的电平变为高电平即可。要实现流水灯功能,我们只要将LED1~LED8依次点亮、熄灭,依始类推,8只LED变会一亮一暗的做流水灯了。
本文将探讨嵌入式系统中的GPIO(通用输入输出)控制,着重介绍GPIO的原理和基本用法。我们将使用一个实际的示例项目来演示如何通过编程配置和控制GPIO引脚。将基于ARM Cortex-M微控制器,并使用C语言进行编写。
我们可以把内核想象成一个服务器,专门响应各种请求。这些请求可以是CPU上正在运行的进程发起的请求,也可以是外部的设备发起的中断请求。所以说,内核并不是串行运行,而是交错执行。既然是交错执行,就会产生竞态条件,我们可以采用同步技术消除这种竞态条件。
前面笔者分享过基于51单片机的两种小车制作,我们利用的是L298N驱动控制电机转动,那么接下来,笔者给大家介绍两种利用51单片机控制步进电机的小程序。 首先我们要如何使电机转动呢,源程序如下:
上一次我们说过,在裸机编程中,通过while(1)大循环来按顺序执行我们的程序,除了中断之外,后面的程序是不可能打断前面的程序来执行的。而在我们的uC/OS III操作系统中,各个任务是完全独立的,各个任务具有自己的优先级,通常按照优先级高低来依次执行,其他的暂时不多说。今天主要说一下任务的创建与管理,还有消息队列。
Systick(滴答时钟)是一个24位,向下计数的定时器,当倒计时完成后,定时器可以产生一个中断,所以,当频率一定,计数个数一定时,这个中断就会以一定的时间间隔发生,如果每个中断发送后调用的中断函数中给一个变量累加,这样我们就可以获得一个与时间相关的变量。有关于滴答时钟相关知识,官方手册和网上已经有非常多的篇幅介绍讲解,这里不再赘述。
从小就对电器元件比较感兴趣吧,经常拿坏的电器里面的芯片拆下来玩,甚至那些没坏的电器,比如我家的电视,也会希望它能坏掉,我好去看看里面是什么样子的,为什么能播放节目……,所以我第一眼看到51单片机的时候,更多的是兴奋。
wx:key 是为了提高循环效率而出现了,给它的值,只要是循环元素中的唯一的标识符就可以了
后台回复关键字“WS2812B”,获取WS2812B模块资料、数据手册及工程源码。
数码管(Segment Displays)由多个发光二极管封装在一起组成“8”字型的器件,引线已在内部连接完成,只需引出它们的各个笔划,公共电极。数码管实际上是由七个发光管(也称7段数码管)组成8字形构成的,加上小数点就是8个。
我们在一个项目小组做一个相对较复杂的工程时,意味着你不再独自单干。而是和小组成员分工合作,这就要求小组成员各自负责一部分工程。比如你可能只是负责通讯或者显示这一块。这个时候,你就应该将自己的这一块程序写成一个模块,单独调试,留出接口供其它模块调用。最后,小组成员都将自己负责的模块写完并调试无误后,由项目组长进行组合调试。像这些场合就要求程序必须模块化。模块化的好处是很多的,不仅仅是便于分工,它还有助于程序的调试,有利于程序结构的划分,还能增加程序的可读性和可移植性。
正常情况下,通过SWD在线调试时,一旦芯片进入低功耗模式(Stop或者Standby),调试就会断开。原因是进入Stop或者Standby模式后,内核时钟就停止了。如果想在调试低功耗代码时还可以正常通过调试接口debug,有没有什么办法呢?
设计思路一(未用中断): 8个LED灯正极解电源,负极接单片机I/O口。 死循环:设置P2口为11111110,使用左移函数,循环七次。 同时每次位移中间加入延时函数。 三个按键:A按键启动、B按键控制不同流水速度(低中高)、C按键控制流水灯暂停蜂鸣器长响: 思路一:设置一个变量i,起初为0,按下A键后为1;当i为1进入死循环 设置变量j,按下B,j++,当j大于3,j=j-3;使用j*1000,来空置循环函数的延时时间。设置bit变量s=0,按下按键C,s++,当s=1,j进入循环蜂鸣器响,s=0退出循环。 在每次延时时检查按键
发布者:全栈程序员栈长,转载请注明出处:https://javaforall.cn/158894.html原文链接:https://javaforall.cn
本篇文章通过一个简单的例子来熟悉模块化编程以及利用库函数的方法进行开发使用STM32外设的基本流程。
对于信号量我们并不陌生。信号量在计算机科学中是一个很容易理解的概念。本质上,信号量就是一个简单的整数,对其进行的操作称为PV操作。进入某段临界代码段就会调用相关信号量的P操作;如果信号量的值大于0,该值会减1,进程继续执行。相反,如果信号量的值等于0,该进程就会等待,直到有其它程序释放该信号量。释放信号量的过程就称为V操作,通过增加信号量的值,唤醒正在等待的进程。
Linux内核中gpio是最简单,最常用的资源(和 interrupt ,dma,timer一样)驱动程序,应用程序都能够通过相应的接口使用gpio,gpio使用0~MAX_INT之间的整数标识,不能使用负数,gpio与硬件体系密切相关的,不过linux有一个框架处理gpio,能够使用统一的接口来操作gpio.在讲gpio核心(gpiolib.c)之前先来看看gpio是怎么使用的
标准库一般是使用系统嘀嗒定时器来进行微妙级别的延时,而HAL库将SysTick定时器用做了库函数的超时定时器,使用的地方非常多,自己修改代码使用嘀嗒定时器的话就会引起错乱。所以此时就需要自己实现一个微秒级别延时函数。
代码中D1代表着位定义,相当于将LED灯对应管脚的位置起一个名字。单片机初始状态管脚默认为高电平,即对应值为1。所以如果想要点亮LED灯,只需要让他的管脚电平为低即可。
在Delphi中,通常可以用以下三种方法来实现程序的延时,即TTtimer控件,Sleep函数,GetTickCount函数。但是其精度是各不相同的。 一、三种方法的简单介绍 1)TTtimer控件 TTtimer控件的实质是调用Windows API定时函数SetTimer和KillTimer来实现的,并简化了对WM_TIMER 消息的处理过程。通过设置OnTimer事 件和Interval属性,我们可以很方便的产生一些简单的定时事件。 2)Sleep函数 Sleep函数用来使程序的执行延时给定的时间值。Sleep的调用形式为Sleep(milliseconds),暂停当前的进程milliseconds毫秒。Sleep的实现 方法其实也是调用Windows API的Sleep函数。例如: sleep(1000); //延迟1000毫秒 Sleep会引起程序停滞,如果你延迟的时间较长的话,你的程序将不能够响应延时期间的发生的其他消息,所以程序看起来好像暂时死机。 3)GetTickCount函数 在主程序中延时,为了达到延时和响应消息这两个目的,GetTickCount()构成的循环就是一种广为流传的方法。例如:
数码管(Segment Displays)由多个发光二极管封装在一起组成“8”字型的器件,引线已在内部连接完成,只需引出它们的各个笔划,公共电极。数码管实际上是由七个发光管组成8字形构成的,加上小数点就是8个。这些段分别由字母a,b,c,d,e,f,g,dp来表示。
定时器是我们最常用到的功能,一般用来完成定时功能,本章我们就来学习一下 Linux 内核提供的定时器 API 函数,通过这些定时器 API 函数我们可以完成很多要求定时的应用。Linux内核也提供了短延时函数,比如 微秒、纳秒、毫秒延时函数,本章我们就来学习一下这些和时间有关的功能。
领取专属 10元无门槛券
手把手带您无忧上云