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

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

3天内不再提示

英创信息技术移植Real Time Linux到英创工控主板简介

英创信息技术 来源:英创信息技术 作者:英创信息技术 2020-02-06 11:11 次阅读

为了使英创的嵌入式主板产品满足工业实时控制的应用需求,我们对ESM335x系列主板的内核进行了调整,重新移植了Linux 4.1.7的系统,在Linux 4.1.7的基础上使用了kernel的RT PATCH(实时补丁),并且修改了相关接口的驱动代码,来保证操作系统的实时性。关于实时Linux(又称RT Linux)系统的相关技术知识可以浏览网站:https://wiki.linuxfoundation.org/realtime/documentation/start进行了解。我们将在下面介绍如何编写面向实时控制的应用程序,以及在实时Linux系统和标准Linux系统环境中,应用程序对硬件事件响应延时的测试结果。

实时应用程序编写

尽管实时Linux系统对内核做了大量的改动来提供系统的实时性,但对于应用程序来说,只需要对有实时要求的线程设置实时优先级属性,以及设置响应的实时线程调度策略就可以了,并没有特殊的API函数。关于设置实时优先级以及调度策略请参考我们网站上的文章:《Linux系统调度简介》,本文中用到的函数以及结构体都在其中有更为详细的介绍。

设置实时优先级以及调度策略有两种方式,一种是在创建线程时设置线程的属性,这样线程创建后就具有了实时优先级并且使用设置的调度策略,函数原型如下:

设置实时优先级属性:

int pthread_attr_setschedparam (pthread_attr_t *attr, const struct sched_param *param)

上述函数所包含的2个参数说明如下:

●pthread_attr_t *attr 由pthread_attr_init函数初始化,是线程的属性

●struct sched_param结构体包含 int sched_priority,也即实施优先级,取值范围0~99。数值越大优先级越高,所有的实时线程优先级都高于普通线程。为了提高系统的实时性,RT Linux将大部分中断服务都改为了线程的形式,使得中断服务可以被实时要求更高的线程抢占,中断处理线程实时优先级为50,操作系统中最重要的线程(如看门狗线程)的优先级为99,当知道应用程序的处理需要等待某个特定的中断才能继续执行,而且该段代码实时性要求很高时,就可以将该段代码所在线程的实时优先级设置为大于50小于99的值,这样就能够不受其他中断处理线程的影响,最大限度的满足实时性要求,比如我们在下面的测试程序中设置我们的线程实施优先级为80。

设置调度策略:

int pthread_attr_setschedpolicy (pthread_attr_t *attr, int policy)

●policy 为调度策略,可选SCHED_FIFO或者SCHED_RR,两者都是实时调度策略,SCHED_FIFO为先进先出,只有高实时优先级线程能抢占当前运行的实时线程,SCHED_RR增加了时间片机制,使得同优先级的实时线程能够轮转运行。

使用示例:

// 设置调度策略为SCHED_FIFO

res = pthread_attr_setschedpolicy(&attr, SCHED_FIFO);

if(res)

{

printf("pthread setschedpolicy faild\n");

}

struct sched_param param;

// 设置实时优先级为80

param.sched_priority = 80;

res = pthread_attr_setschedparam(&attr, ¶m);

if(res)

{

printf("pthread setschedparam faild\n");

}

另一种方式是修改已经存在的线程,设置其实时优先级和使用的调度策略,可以在其他线程中设置,也可以在线程中自行设置,只需要知道线程的PID,线程自行设置时PID为0,函数原型如下:

int sched_setscheduler (pid_t pid, int policy, const struct sched_param *param)

使用示例:

struct sched_param param;

// 设置实时优先级为80并且使用调度策略SCHED_FIFO

param.sched_priority = 80;

if(sched_setscheduler(0, SCHED_FIFO, ¶m))

printf("wrong sched_setscheduler\n");

还有其他的函数可以设置这些相关属性,具体请参考我们网站的文章《Linux调度策略简介》,或者其他相关资料。一般的使用是将有实时要求的功能代码放入单独的线程中,主程序以普通线程启动后建立实时线程来完成相关功能。由于实时线程的不可抢占性,不恰当的使用有可能会造成系统资源被无限占用,而影响系统的正常运行,因此在开发阶段需要特别注意,规划好实时线程的任务,尤其是要检查循环语句,对于循环任务的设计可以参考网站资料:https://wiki.linuxfoundation.org/realtime/documentation/howto/applications/cyclic。

RT Linux的实时性测试

在我们的测试中,由GPIO中断作为硬件事件,具体是使用外部的方波信号发生器作为中断源,驱动检测到GPIO中断后会唤醒用户层的中断处理线程(该线程已设置为实时线程),实时中断处理线程作为对中断事件的响应,是将另一位GPIO的输出电平反相(Toggle处理)。用示波器测量输入的中断信号和作为响应的GPIO信号之间的时间延迟。程序部分代码如下:

struct paraset

{

int fd; // 中断设备对应的文件

int gpio; // 线程使用的GPIO进行toggle处理

int rt_prio; // 线程的实时优先级,0则设置为普通线程

};

int IRQSelectThreadFunc(void* lparam)

{

struct paraset * p = (struct paraset*)lparam;

int fd = p->fd ; // 获取中断设备对应的文件识别号

int i=0;

printf ( "fd = %d \n", fd );

struct sched_param param;

param.sched_priority = p->rt_prio; // 设置实时优先级,由主线程传入

if(p->rt_prio)

if(sched_setscheduler(0, SCHED_FIFO, ¶m))

printf("wrong sched_setscheduler\n");

fd_set fdRead;

struct timeval aTime;

int ret;

GPIO_OutEnable(gpio_fd, 1<

gpio);

while(1)

{

FD_ZERO(&fdRead);

FD_SET(fd,&fdRead);

aTime.tv_sec = 2;

aTime.tv_usec = 0;

// 等待中断事件

ret = select ( fd+1, &fdRead, NULL, NULL, &aTime );

if ( ret<0 )

printf( "select, something wrong!\n " );

if ( ret>0 )

{

if ( FD_ISSET(fd, &fdRead) )

{

//toggel one gpio

nIrqCounter++;

if(nIrqCounter%2)

GPIO_OutClear(gpio_fd, 1<

gpio);

else

GPIO_OutSet(gpio_fd, 1<

gpio);

}

}

}

pthread_exit( NULL );

return 0;

}

int StartPulseThread( struct paraset *p )

{

pthread_attr_t attr;

pthread_t m_thread;

int res;

struct sched_param param;

// 创建gpio线程

res = pthread_attr_init(&attr);

if( res!=0 )

{

printf("Create attribute failed\n" );

}

// 主程序传入的参数,判断实时优先级是否为0,不为0则设置为实时线程

if(p->rt_prio)

{

// 设置调度策略为SCHED_FIFO

res = pthread_attr_setschedpolicy(&attr, SCHED_FIFO);

if(res)

{

printf("pthread setschedpolicy faild\n");

}

// 设置实时优先级

param.sched_priority = p->rt_prio;

res = pthread_attr_setschedparam(&attr, ¶m);

if(res)

{

printf("pthread setschedparam faild\n");

}

res = pthread_attr_setinheritsched(&attr, PTHREAD_EXPLICIT_SCHED);

if(res)

{

printf("pthread setinheritshed faild\n");

}

printf("set %d rt_priority: %d\n", p->fd, p->rt_prio);

}

// 创建线程

res = pthread_create( &m_thread, &attr, (void *(*) (void *))&IRQSelectThreadFunc, p );

if( res!=0 )

{

return -1;

}

pthread_attr_destroy( &attr );

return 0;

}

我们用同一个测试程序分别在ESM3354和ESM3352的标准Linux版本和RT Linux上运行,当输入100Hz方波信号,即硬件中断间隔为10ms时,随机测试100次中断延时的统计结果如下:

主板型号 ESM3354 ESM3352
CPU信息 Cortex-A8 主频1GHz Cortex-A8 主频600MHz
操作系统 Linux-4.1.6 RT Linux-4.1.7 Linux-4.1.6 RT Linux-4.1.7
空载中断延时最小值(us) 16 15 26 20
空载中断延时最大值(us) 24 20 39 27
空载中断延时平均值(us) 19.64 16.16 30.92 25.04
空载中断延时标准值(us) 1.22 0.69 2.41 0.65
满载中断延时最小值(us) 88 58 100 80
满载中断延时最大值(us) 1050 185 2200 220
满载中断延时平均值(us) 140.73 94.36 183.06 108.94
满载中断延时标准值(us) 115.17 17.33 246.15 18.81

从上表可以看到:

●尽管在空载情况下普通Linux系统与RT Linux系统的中断延时参数差异不大,但在满负荷下差异就非常明显了,特别是中断延时最大值。均超过1ms,这意味着普通Linux只能用于对实时性要求很低的场合。相对的,RT Linux在这项指标上有了很大的提高,已可满足最小硬件中断间隔为1ms的应用。

●RT Linux无论在空载还是满载的情况下,中断延时的方差,相对其平均值都比较小,这表示RT Linux系统对硬件中断的响应延时很一致,响应时间更稳定,这也是良好实时性的重要指标。

●ESM3354相比于ESM3352由于CPU主频更高,响应时间更短,但是在RT Linux上的响应时间均方差差别不大。由于ESM3352成本更低,而对于实时应用来说响应的实时性与ESM3354基本相同,所以在选购时客户可以优先考虑性价比更高的ESM3352。

进一步,把外部中断频率提高一个数量级,即把中断间隔缩短至1ms,再来比较中断响应延时的变化。测试数据如下:

主板型号 ESM3354 ESM3352
CPU信息 Cortex-A8 主频1GHz Cortex-A8 主频600MHz
操作系统 RT Linux-4.1.7
硬件中断间隔 10000us 1000us 10000us 1000us
空载中断延时最小值(us) 15 14 20 22
空载中断延时最大值(us) 20 18 27 30
空载中断延时平均值(us) 16.16 14.80 25.04 23.25
空载中断延时标准值(us) 0.69 0.57 0.65 0.92
满载中断延时最小值(us) 58 40 80 54
满载中断延时最大值(us) 185 125 220 160
满载中断延时平均值(us) 94.36 57.30 108.94 70.58
满载中断延时标准值(us) 17.33 9.69 18.81 11.78

可以看到,外部中断间隔变小之后,响应延时并没有变得更大,反而由于代码执行频率增加而更有可能常驻高速cache从而更快的得到运行,减小响应延时。考虑到我们测试程序的中断处理线程在收到中断后处理比较简单,而实际应用中往往需要执行更为复杂的操作,需要更多的执行时间,一般在50us的水平,这样从硬件中断开始,到处理线程完成响应动作,最长需要大约270us时间。

根据以上的测试分析,可以认为ESM335x + RT Linux系统是完全能满足最小硬件中断间隔不低于1ms的实时控制应用,这意味着可满足大部分的实时控制的应用需求。

我们也将会在近期推出ESM6800的RT Linux版本,ESM6800采用iMX6UL Cortex-A7 528MHz CPU,以低功耗、低成本为特色,特别适用于对成本敏感的批量工业智能设备。请关注我们官网以及官方微信公众号的最新信息。

有兴趣的客户可以直接和我们的工程师进行沟通获取相关文件进行评估测试。

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

    关注

    87

    文章

    10990

    浏览量

    206729
  • 嵌入式主板
    +关注

    关注

    7

    文章

    6064

    浏览量

    34611
收藏 人收藏

    评论

    相关推荐

    通过大小鼠无血压测量实验明白了无血压测量技术的重要性

    ,掌握无血压测量技术对于医学研究具有重要意义。 不同动物种群之间的差异性:不同动物种群之间存在一定的生理差异,这些差异可能会影响血压测量结果的准确性。例如,大鼠和小鼠的心脏大小
    发表于 04-22 09:40

    EMC技术:基础概念到应用的解读?|深圳比达电子.

    EMC技术:基础概念到应用的解读?|深圳比达电子电磁兼容性(Electromagnetic Compatibility,简称EMC)作为一项重要的技术领域,在现代电子设备中扮演着至关重要的角色
    发表于 03-11 11:59

    恩智浦Real-time Edge v2.7正式发布!

    Real-time Edge软件是恩智浦提供的针对工业和物联网应用的一套软件集,面对工业和物联网垂直领域的具体需求,提供了针对性的实时系统, 工业实时网络和丰富的工业协议支持。
    的头像 发表于 01-26 09:19 225次阅读
    恩智浦<b class='flag-5'>Real-time</b> Edge v2.7正式发布!

    码科技精彩亮相火爆的IOTE 2023,多面赋能AIoT产业发展!

    产品,包括覆盖多层次算力的智能工作站(边缘计算盒子)、AI加速卡等;同时向大家展示自研的AI技术服务——“深元”0代码移植工具链和创新性的行业解决方案,赋能更多AIoT产业生态企业快速具备AI能力
    发表于 09-25 10:03

    信息技术是干什么?

    广播电子技术信息技术
    橙群微电子
    发布于 :2023年09月22日 09:17:48

    [华科智]RK3588核心板开发

    感谢电子发烧友论坛网。 感谢深圳市华科智技术科学有限公司。 感谢深圳市鸿达数码科学有限公司。 今儿个给大伙分享一款核心板-RK3588-M45 更多产品信息,请私wo
    发表于 09-18 16:03

    什么是工控主板,国产工控主板的设计特性

    工控主板是专门用于工业电脑的主板,其设计特性独特且适应工业环境的需求。国产工控主板在元器件选择、抗干扰性和接口设计等方面具有独到之处。
    的头像 发表于 08-28 14:13 333次阅读

    泰伦通话降噪方案,采用深度学习降噪算法,让通话更清晰

    麦克风采集扬声器输出的声音并再次放大,形成了一个正反馈回路,导致高频振荡和噪音。采用防啸叫技术可以防止声音失真,保护听力健康,提升通话体验。 4、通话EQ调节:EQ(Equalization)是一种音频
    发表于 08-22 17:36

    华秋硬联合安加速器,加速和创新赋能技术驱动型创业者

    167亿,获2轮及以上融资的企业占比达54%。 02****生态伙伴介绍:安加速器 **安加速器作为Arm全球唯一加速器,依托于Arm全球庞大的生态系统资源及行业领先的技术,**通过创业加速和创新赋
    发表于 08-18 14:37

    新版本Real-time Edge正式发布啦!高效的工业边缘实时应用开发,就用它!

    了解Real-time Edge Software,请 观看本视频 Real-time Edge的实时系统提供了四种不同调度延迟的方案以及四种方案之间不同的组合,包括Preempt-RT Linux、RTOS在Cortex-A上
    的头像 发表于 08-18 08:05 712次阅读
    新版本<b class='flag-5'>Real-time</b> Edge正式发布啦!高效的工业边缘实时应用开发,就用它!

    可瑞直流充电模块电路板图纸

    有没有大佬可以提供一下可瑞GZ22010-3的电路板图呢
    发表于 08-17 19:46

    泰伦新成果发布交流会线上直播预约开启

    声音,是由物体或介质的振动引起的,振动源的多样性、振动的频率和波形的差异、传播介质的差异等因素共同作用,使我们能够感知丰富而多样化的声音世界。听得到、听得清、听得懂、辨得明,是AI语音技术的重要
    发表于 08-15 14:31

    触翔3588工控主板的优势

    触翔3588工控主板是一款基于Intel Baytrail平台设计的主频为2.4Ghz的工控主板,具有以下优势:
    的头像 发表于 06-29 15:28 513次阅读
    触翔3588<b class='flag-5'>工控</b><b class='flag-5'>主板</b>的优势

    硬科技,未来!第十五届深赛福田预选赛-华秋第九届硬大赛正式启幕

    :深圳市福田区科技创新局 主办单位:深圳华秋电子有限公司 官方媒体:电子发烧友、硬声APP 联合主办单位: 深圳市福田区新一代信息技术产业链党委、深圳新一代产业园、深圳市微纳集成电路与系统应用研究
    发表于 05-16 11:45

    生态伙伴 | 硬大赛新起航!携手华强科广场,助力硬科技创业者

    。 项目同时也是福田区首个以先进智造业为主题的产业园区,园区将重点围绕智能终端、智能机器人、高端装备制造、半导体与集成电路、新一代信息技术等先进智造业上下游进行招商引资,入驻企业将有机会获得政府租金补贴
    发表于 05-16 09:51