0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

英创信息技术Linux应用程序实现精确延时介绍

英创信息技术 来源:英创信息技术 作者:英创信息技术 2020-01-17 09:51 次阅读
加入交流群
微信小助手二维码

扫码添加小助手

加入工程师交流群

Linux应用程序中,常用的延时函数包括sleep()、usleep()、select()等,这几个延时函数函数的执行机制,都是将当前线程挂起,由操作系统做延时,然后再恢复当前线程。这意味着其延时的最小间隔是两次线程切换时间。经测试,在单一线程情况下,两次线程的切换时间在150us左右。大多数情况下,应用程序会有多个线程在运行,这时线程恢复有可能在下一个时间片,而Linux系统缺省的线程轮片时间为10ms,这意味着只有当延时在大于10ms情况时,常规的延时函数才有意义。在工控领域,我们常常碰到需要微秒级的延时需求,例如实现某种读写时序等,这时Linux系统的常规延时函数难于满足其需求。针对这样的应用需求,我们设计了采用内存映射的方法操作主板的硬件定时器和GPIO,从而产生出具有微秒精度的脉冲波形来。下面就详细介绍如何在用户进程实现这样的精确延时的操作。

以EM335x工控主板为例,用其内部的定时器来实现精确延时的功能,EM335x内部定时器的输入时钟为24MHz,单位时间为41.6ns,通过将Linux系统的mem设备文件和mmap()函数结合起来使用,可直接对EM335x内部定时器的寄存器进行操作,再通过同样的方式控制GPIO,实现:(1)设置GPIO,(2)启动定时器,当检测到定时器计数完毕,(3)再设置GPIO,共三个步骤,就可产生精确时间间隔的脉冲。

Linux系统中的/dev/mem设备文件,是专门用来读写物理地址用的,里面的内容是所有物理内存的地址以及内容信息。只要我们使用mmap()函数将/dev/mem设备文件映射到进程地址空间,实现对内存物理地址的读写,就能够通过这种方式快速的对GPIO和定时器进行操作,而mmap操作提供了一种机制,让用户程序直接访问设备内存,这样就相当于直接对硬件进行操作,从而避开了驱动程序,如果调用驱动就需要在用户空间和内核空间互相拷贝数据,还会涉及到系统调度等机制,效率将会变低。

将/dev/mem/设备文件中定时器的地址映射到用户进程空间的代码:
void *timer_em335x_pin_config(unsigned int BASE)
{
int mem_fd;
void *base;
mem_fd = open('/dev/mem', O_RDWR|O_SYNC);
printf('mem_fd is %d\n', mem_fd);
/* mmap Timer */
base = mmap(
NULL, //起始地址
DMTIMER_DEV_SIZE, //映射的文件内容的大小
PROT_READ|PROT_WRITE,//映射区域可读可写
MAP_SHARED, //映射区域的写入数据会写回到原来的文件
mem_fd,
BASE//被映射的硬件地址
);
close(mem_fd);
return base;
}

将/dev/mem/设备文件中GPIO的地址映射到用户进程空间的代码:
void *GPIO_MMAP::gpio_em335x_pin_config(unsigned int BASE)
{
int mem_fd;
void *base;
mem_fd = open('/dev/mem', O_RDWR|O_SYNC);
printf('mem_fd is %d\n', mem_fd);
/* mmap GPIO */
base = mmap(
NULL,//起始地址
GPIO_DEV_SIZE, //映射的文件内容的大小
PROT_READ|PROT_WRITE,//映射区域可读可写
MAP_SHARED,//映射区域的写入数据会写回到原来的文件
mem_fd,
BASE //被映射的硬件地址
);
close(mem_fd);
return base;
}

成功执行时,mmap()函数返回被映射区的指针。普通文件被映射到进程地址空间后,进程可以像访问普通内存一样对文件进行访问,不必再调用read(),write()等操作。只需要使用返回的地址指针在对应的寄存器的偏移地址赋值,就可以完成操作。在例程中已经将函数接口引出(详细的代码请参考例程):
ptr=Timer_Init();//初始化,将定时器地址映射到用户进程
Timer_Start(ptr, GPIO0, 0xfffffffa); //启动定时器,并设置时间和哪一位GPIO

定时器是从0计数到0xffffffff,需要实现定时功能,我们就要改变定时器的初值,上面的程序中0xfffffffa为定时器的初值,前面提到过由于EM335x定时器时钟为24MHZ,所以定时器单位时间为1/24000000=41.6ns,假设程序访问寄存器还需要花费时间T0,在计算初值的时候,就需要加上这一部分时间才能保证准确性,因此定时器取值的计算公式为:
T=0xffffffff-(目标延时/41.6ns)+T0

经过测试,执行一次程序访问寄存器所需花费的时间大约为T0=800ns。举个例子,比如目标延时为2μs,那么定时器初值为:0xffffffff-(2000/41.6)+800,也就是0xffffffe2,测试的时候带入这个值,再进行微调,即可得到想要的结果。

使用英创工控主板运行例程测试,分别测试延时1μs,1.5μs,2μs,5μs,10μs时的精度,结果如下:

目标延时 定时器取值 实际延时
Min Max
1us 0xfffffffa 1.14us 1.20us


1us的测试波形

目标延时 定时器取值 实际延时
Min Max
1.5us 0xffffffee 1.46us 1.52us


1.5μs的测试波形

目标延时 定时器取值 实际延时
Min Max
2us 0xffffffe2 1.90us 2.08us

2μs的测试波形

目标延时 定时器取值 实际延时
Min Max
5us 0xffffff9a 4.92us 5.04us

5μs的测试波形

目标延时 定时器取值 实际延时
Min Max
10us 0xffffff22 9.90us 10.10us


10μs的测试波形

可以看到,在1μs时,误差范围在±200ns左右,超过1μs,其余的取值,误差都在±100ns以内,随着延时的增加,精确度将越来越高,在10μs的时候,误差已经非常小了。

通过以上方案实现了在用户进程对精确延时的操作,详细的操作代码请参考例程。

关于这一方法在EM9x60系列工控主板上的实现可阅读下文:英创嵌入式主板支持精确延时操作之二

注意事项:我们推荐客户直接使用例程中引出的接口进行操作,不推荐客户对硬件访问这一部分代码进行修改,以免在操作的时候出现无法预估的错误。

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • Linux
    +关注

    关注

    88

    文章

    11854

    浏览量

    219824
  • 嵌入式主板
    +关注

    关注

    7

    文章

    6107

    浏览量

    37204
收藏 人收藏
加入交流群
微信小助手二维码

扫码添加小助手

加入工程师交流群

    评论

    相关推荐
    热点推荐

    龙芯中科携手五所高校加速构建自主信息技术人才体系

    为推动国产自主可控处理器深度融入高校人才培养全链条,加速构建自主信息技术人才体系,龙芯校园行活动相继走进中国科学技术大学、安庆师范大学、湖南大学、广西大学、大连理工大学5所高校,聚焦龙芯自主信息技术
    的头像 发表于 04-13 14:32 503次阅读

    如何构建蓝牙应用程序

    应用程序使用蓝牙(blueZ)。 我已经安装了 gcc-riscv64-linux-gnu。 但是,没有安装 blueZ 标头和库。 如何构建我的蓝牙应用程序
    发表于 04-01 07:31

    龙芯中科成功举办2025信息技术应用创新产教融合交流会

    11月30日,在教育部教育管理信息中心、山东省电化教育馆的支持和指导下,龙芯中科联合浪潮集团、济南幼儿师范高等专科学校(以下简称“济南幼高专”),成功举办信息技术应用创新产教融合交流会,并同步举行信息技术应用创新实践基地启用仪式
    的头像 发表于 12-08 14:53 1041次阅读

    龙芯中科助力2025教育信息技术应用创新大赛成功举办

    2025年11月13日-15日,由中国教育技术协会主办、浙江大学与中国教育技术协会网络安全专业委员会联合承办,中国电子工业标准化技术协会信息技术应用创新工作委员会、浙江高校信
    的头像 发表于 11-21 16:23 984次阅读

    使用系统定时器SysTick来实现精确延时微秒和毫秒函数

    精确延时函数的实现 在core_cm3.h文件中,有这样一个SysTickConfig函数: __STATIC_INLINE uint32_t SysTick_Config(uint32_t
    发表于 11-20 07:12

    诚迈科技信电脑助力2025第二届教育信息技术应用创新大赛圆满收官

    11月15日,由中国教育技术协会主办、浙江大学与中国教育技术协会网络安全专业委员会联合承办,中国电子工业标准化技术协会信息技术应用创新工作委员会、浙江高校信
    的头像 发表于 11-17 17:58 893次阅读
    诚迈科技信<b class='flag-5'>创</b>电脑助力2025第二届教育<b class='flag-5'>信息技术</b>应用创新大赛圆满收官

    OBOO鸥柏|信触摸一体机兆芯115寸Linux国产系统技术智造

    BOO鸥柏信触摸一体机:兆芯115寸Linux智造新标杆在信息技术应用创新浪潮中,【OBOO鸥柏】推出的信触摸一体机以其卓越性能和智能化设计,成为行业数字化转型的重要工具。这款搭载
    的头像 发表于 11-16 15:44 3086次阅读
    OBOO鸥柏|信<b class='flag-5'>创</b>触摸一体机兆芯115寸<b class='flag-5'>Linux</b>国产系统<b class='flag-5'>技术</b>智造

    宝马南京信息技术有限公司开业

    今日,宝马(南京)信息技术有限公司在南京正式“挂牌运行”。这家华晨宝马全资子公司由领悦数字信息技术有限公司南京分公司“迭代”而来,代表着一次里程碑式的“进化”。这次升级不仅加速了宝马在华数字化转型进程,更通过深化本土创新,为“未来智慧出行”的发展谱写了核心“代码”。
    的头像 发表于 10-29 15:17 866次阅读

    学生适合使用的SOLIDWORKS 云应用程序

    随着科技的不断发展,计算机辅助设计(CAD)技术已经成为现代工程教育的重要组成部分。SOLIDWORKS作为一款CAD软件,其教育版云应用程序为学生提供了强大而灵活的设计平台。本文将探讨
    的头像 发表于 09-15 10:39 1022次阅读
    学生适合使用的SOLIDWORKS 云<b class='flag-5'>应用程序</b>

    易华录入选国家级信息技术应用创新典型解决方案

    近日,工业和信息化部网络安全产业发展中心(工业和信息化部信息中心)公布了“2024年信息技术应用创新解决方案”评选结果。易华录申报的“基于节能高效蓝光的超级智能存储解决方案”凭借显著的
    的头像 发表于 08-07 15:35 1872次阅读

    信息技术应用产学协同人才培养行动计划”正式发布,诚迈科技入选首批参与单位

    设在中国软件评测中心。诚迈科技作为信技术先锋企业,受邀成为首批参与单位,与国内顶尖高校、领军企业和权威机构携手,共同打造具有中国特色的信息技术人才培养新范式,为
    的头像 发表于 08-06 17:29 1790次阅读
    “<b class='flag-5'>信息技术</b>应用产学协同人才培养行动计划”正式发布,诚迈科技入选首批参与单位

    佛瑞亚如何通过信息技术推动业务增长

    在数字化、信息化的浪潮下,信息技术已经不仅是后台工具,更成为驱动企业发展的关键力量。本期Women Inspiring Mobility,我们采访了佛瑞亚中国区信息技术总监马瑛,了解她和团队如何将
    的头像 发表于 07-29 14:00 1103次阅读

    飞腾主板为信产业发展提高硬实力

    信息技术飞速发展的当下,信产业已成为我国实现科技自立自强、保障国家信息安全的关键领域。信,即信息技
    的头像 发表于 07-22 18:20 882次阅读

    DEKRA德凯成为沙特通信和信息技术设备技术法规认证机构

    近日,DEKRA德凯成功获得沙特标准、计量和质量组织(SASO)认可,正式成为沙特通信和信息技术设备技术法规(Technical Regulation for Communications
    的头像 发表于 07-15 14:27 1122次阅读

    科普|信是什么?一文读懂“信息技术应用创新”战略

    什么是信?信,即“信息技术应用创新”,是国家推动IT系统自主可控、安全可控的重要战略工程。它不仅是技术层面的创新,更承载着保障国家网络安全、推动产业升级和
    的头像 发表于 06-13 10:06 9887次阅读
    科普|信<b class='flag-5'>创</b>是什么?一文读懂“<b class='flag-5'>信息技术</b>应用创新”战略