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
    +关注

    关注

    88

    文章

    11628

    浏览量

    217990
  • 嵌入式主板
    +关注

    关注

    7

    文章

    6107

    浏览量

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

扫码添加小助手

加入工程师交流群

    评论

    相关推荐
    热点推荐

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

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

    3A6000四核龙芯工控主板,推动信工控深度融合

    当今信科技快速发展,技术的不断演进和市场需求的变化,在工控领域也在进行源源不断地创新,其中最引人注目的是国产龙芯主板在其中的发展应用。
    的头像 发表于 11-14 09:10 208次阅读

    新时代的硬核基石:龙芯工控主板助力信产业新基建

    在数字技术重塑产业格局的今天,信产业已成为保障国家信息技术安全的核心战略。作为工业自动化系统的大脑,工控主板的自主可控程度直接决定信创新基
    的头像 发表于 11-05 13:54 138次阅读

    国产工控机品牌康仕:廿五载厚积薄发,自主产品线赋能智造未来

    康仕工控自2000年成立以来,已在工业控制领域专注耕耘二十五载。历经长期的精密制造与研发技术沉淀,康仕正稳步从专业的幕后伙伴,向自主品牌市场拓展,并依托其逐步完善的全国产化产品线,
    的头像 发表于 10-10 15:59 352次阅读
    国产<b class='flag-5'>工控</b>机品牌<b class='flag-5'>英</b>康仕:廿五载厚积薄发,自主产品线赋能智造未来

    智慧新核心,龙芯主板助力信体系再升级

    信息技术飞速发展的当下,信体系的自主可控与创新升级已成为国家战略层面的关键任务。作为信产业发展的重要基础硬件支撑,国产工控主板正发挥着
    的头像 发表于 08-11 09:14 566次阅读

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

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

    浪潮澎湃,国产主板迎来黄金时代!

    2025年7月,表示必须在2027年底前完成信100%替代,覆盖基础硬件、基础软件等核心领域。在信息技术应用创新浪潮席卷下,国产主板作为计算机系统的骨架,正从幕后走向台前。政策加持、技术
    的头像 发表于 07-21 14:00 364次阅读

    诺达EDA专题技术研讨会成都站圆满收官

    近日,诺达的EDA专题技术研讨会在成都“芯火”双基地成功举办,吸引了来自芯片设计企业、科研院所及产业链上下游的三十余家单位参会,共同探索国产EDA工具在芯片设计关键领域的创新突破与应用实践。
    的头像 发表于 07-21 10:38 725次阅读

    中星微技术斩获2025金牛科企业奖

    6月14日,由中国证券报主办的2025科金牛奖颁奖典礼在上海市举行,2025科金牛奖获奖名单现场揭晓。其中中星微技术获得新一代信息技术金牛科
    的头像 发表于 06-16 14:16 1048次阅读

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

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

    诺达斩获第四届“赢未来”集成电路赛道一等奖

    日前,“赢未来”第四届长三角G60科走廊科技与产业创新大赛(松江赛区)暨第五届“海聚英才”全球创新创业大赛(松江区选拔赛)成功举办,诺达凭借其EDA软件及解决方案,从80余个硬科技项目中脱颖而出,斩获集成电路赛道一等奖!
    的头像 发表于 05-23 10:16 740次阅读

    浪潮下,国产主板有什么新的发展机遇?

    信息技术应用创新浪潮的推动下,国产主板迎来了诸多新的发展机遇。信产业旨在实现信息技术领域的自主可控,这一战略目标为国产主板的发展提供了广
    的头像 发表于 05-09 09:24 574次阅读
    信<b class='flag-5'>创</b>浪潮下,国产<b class='flag-5'>主板</b>有什么新的发展机遇?

    国产工控机品牌推荐:康仕——以自主可控技术赋能智能制造

    在工业4.0与“新基建”战略的双重驱动下,国产工控机正成为保障工业安全、推动数字化转型的核心装备。作为国产化替代的先锋品牌,康仕凭借全栈自主研发能力与行业深度定制经验,为能源电力、智能制造
    的头像 发表于 05-07 10:50 881次阅读
    国产<b class='flag-5'>工控</b>机品牌推荐:<b class='flag-5'>英</b>康仕——以自主可控<b class='flag-5'>技术</b>赋能智能制造

    韧科技推出新主控,4K随机读写超120万IOPS行业标杆

    了一款新的主控芯片,这颗芯片在技术上有了哪些突破?针对当前汹涌而来的AI技术,又有哪些布局?为此,电子发烧友网采访到了韧科技的CEO刘刚和数据存储技术副总裁陈杰。  
    的头像 发表于 03-26 00:10 3073次阅读
    <b class='flag-5'>英</b>韧科技推出新主控,4K随机读写超120万IOPS<b class='flag-5'>创</b>行业标杆