当前位置:首页 > 嵌入式 > 嵌入式软件
[导读]随着网络控制技术的快速发展,工业以太网得到逐步完善,在工业控制领域获得越来越广泛的应用。工业以太网使用了TCP/IP协议,便于联网,并具有高速控制网络的优点。随着32位嵌入式CPU价格的下降,性能指标的提高,为嵌入式系统的广泛应用和Linux在嵌入式系统中的发展提供了广阔的空间。由于Linux的高度灵活性,可以容易地根据应用领域的特点对它进行定制开发,以满足实际应用需要。

1、前言

随着网络控制技术的快速发展,工业以太网得到逐步完善,在工业控制领域获得越来越广泛的应用。工业以太网使用了TCP/IP协议,便于联网,并具有高速控制网络的优点。随着32位嵌入式CPU价格的下降,性能指标的提高,为嵌入式系统的广泛应用和Linux在嵌入式系统中的发展提供了广阔的空间。由于Linux的高度灵活性,可以容易地根据应用领域的特点对它进行定制开发,以满足实际应用需要。

2、基于Linux的嵌入式系统在测控系统中的设计

计算机测控系统本质上就是计算机控制系统,为了对被控对象实施控制,对其参数和状态进行检测是必不可少的。

2.1 测控系统整体设计

测控系统以基于Linux的嵌入式系统为核心,应用程序可通过网络进行更新,通过键盘进行人机对话,数据可通过LCD现场显示。重要数据可以文件形式保存在Flash存储器中,数据和报警信息还可通过串口向上位机传输,也可通过以太网口向Inernet发布信息。用户通过显示界面查看设备状态,设置设备参数,实现远程监控、远程维护。

2.2 总体框图[1]

2.3 嵌入式系统硬件设计

2.3.1 硬件框图

考虑一般测控系统对嵌入式系统要求比较多的功能有:键盘接口、显示接口、A/D(或D/A)转换单元、可扩展的UO接口、打印机接口、与PC机通信的串行接口、以太网口等。实现的嵌入式系统硬件框图如图2-2所示[3]:

2.3.2 Linux下设备驱动程序的开发

Linux系统中,内核提供保护机制,用户空间的进程一般不能直接访问硬件。Linux设备被抽象出来,所有设备都看成文件。用户进程通过文件系统的接口访问设备驱动程序,设备驱动程序主要完成如下功能:

①探测设备和初始化设备;②从设备接受数据并提交给内核;③从内核接受数据送到设备;④检测和处理设备错误。

3、基于 RTAI-Linux的嵌入式系统的软件实现

3.1 RTAI实时硬件抽象层的实现机理

引入新的数据结构rt_hal,形成了实时硬件抽象层RTHAL(Real Time Hardware Abatract Layer),rt_hal结构体的定义如下:

struct rt_hal
{
struct desc_struct*idt table;
void(*disint)(void);
void(*enint)(void);
unsigned int(*getflags)(void);
void(*setflags)(unsigned int flags);
void(*mask_and_ack_8259A)(unsigned int irq);
void(*unmask_8259A_irq)(unsigned int irq);
void(*ack_APIC_irq)(void);
void(*mask_IO_APIC_irq)(unsigned int irq);
void(*unmask_I0_APIC_irq)(unsigned int irq);
unsigned long *Io_apic_irgs;
void*irq_controller_lock;
void*irq_desc;
int *irq_vector;
void *irq_2_pin;
void* ret_from_intr;
struct desc_struct *gdt_table;
volatile int*idle_weight;
void (*lxrt_cli)(void);
};
在usr/src/Linux/arch/i386/kernel/irq.c中初始化为rthal:
struct rt_hal rthal
{
idt_table, /*中断向量表*/
Linux_cli, /*关中断函数*/
Linux_sti, /*开中断函数*/
Linux_save_flags, /*保存中断前的标志*/
Linux_restore_flags, /*恢复中断前的标志*/
Task_and_ack_8259A, /*中断屏蔽*/
Enable_8259A_irq, /*中断使能*/
Linux_ack_APIC_irq,
(), /*在io_apic.c文件中设置*/
&io_apic_irgs,
&irq_controller_lock,
irq_desc,
irq_vector,
(), /*在io_apic.c文件中设置*/
&ret_from_imr,
gdt_table, /*全局描述符表*/
&idle_weight,
()
};

初始化rthal时,指向函数的指针变量指向实现原来标准Linux中开、关中断等功能的函数如下:

static void linux_cli(void)
{
hard_cli();
}
static void linux_sti(void)
{
hard_sti();
}
static unsigned int linux_save_flags(void)
{
int flags;
hard_save_flags(flags)
turn flags
}
static void linux_restore_flags(unsigned int flags)
{
hard_restore_flags(flags);
}

当加载RTAI模块时,执行rt_mount_rtai函数如下:

void rt_mountes_rtai(void)
{
rthal.disint=linux_cli;
rthal.enint=linux_sti;
rthal.getflags=linux_save_flags;
rthal.setflags=linux_restore_flags;
rthal.mask_and_ack_8259A=trpd_mask_and_ack_irq;
rthal.unmask_8259A_irq=trpd_unmask_irq;
}

rthal中指向函数的指针变量指向了RTAI中实现的同名函数,在RTAI中实现的关中断函数如下:

static void linux_cli(void)
{
processor[hard_cpu_id()].intr_flag=0;
}

在RTAI中引入新的数据结构processor,描述和中断有关的处理器的状态:

static struct cpu_own_status
{
volatile unsigned int intr_flag;
volatile unsigned int linux_intr_flag;
volatile unsigned int pending_irqs;
volatile unsigned int activ_irqs;
}
processor[NR_RT_CPUS];

当执行关中断时,只是将数据结构processor中的中断标志位intr_flag设为0,而不是真正的清除eflags寄存器的IF标志来关中断,解决了Linux中长期关中断的问题。

3.2 采用RTAI增强Linux实时性的实现[4]

通过修改Linux内核相关的源文件,形成实时硬件抽象层。执行insmod命令,挂载上提供实时服务的rtai,rtai_sched,rtai_fifos模块,得到如下信息[2]:

Linux tick at 100Hz
Calibrated cpu frequency 551268530Hz
Calibrated 8254-timer-interrupt-to-scheduler latency 8000ns
Calibrated one shot setup time 3000ns
Module Size Used by
rtai_sched 16608 0 unused
rtai_fifos 33468 0 unused
rtai 20728 1 (rati_sched rtai-fifos)

加载上应用程序需要的RTAI模块后,就可以在RTAI-Linux环境下开发应用程序。

3.3 基于RTAI-Linux的应用程序的开发

针对工业测控系统的数据采集、数据处理、控制、通信等具体应用,将应用程序分为实时任务和非实时任务。实时任务利用RTAI提供的API来开发,编写成内核模块,工作在Linux的核心态。用户进程可利用Linux操作系统提供的大量资源,进行TCP/IP网络通信,开发图形用户界面程序等。实时任务之间、实时任务和非实时任务之间可通过Fifo队列和共享内存等方法通信。RTAI-Linux应用程序结构如图3-1所示。

数据采集任务的实现在rt_process.c中的主要函数如下:

static void data_collect()
{
rtf_put(FIFO,&data_value,sizeof(data_value);/*将采集的数据放入实时FIFO中*/
rt_task_wait_period();
}
int int_module(void)
rtime tick_period;
rt_set_periodic_mode(); /*将定时器设置为周期模式*/
rt_task_init(&rt_task,data_collect,l,Stack_size,task_priority,1,0);/*初始化数据采集任务*/
return ()
}
void cleanup_module(void)
{
stop_rt_timer();
rtf_destroy(FIFO);
rt_task_delete(&rt_task);
return;
}

数据显示程序的实现在disaplay.c中的主要函数:

int main(void)
{
if((fifo=open("/dev/rtf()",()_rdonly))<0)
{
fprintf(stderr,"Error opening/dev/rtf() ");
exit(1);
}
read(fifo,&data_value,sizeof(data_value));/*用户进程从实时FIFO中读取数据*/
printf("data%f ",data_value)
}

4、结论

本文给出了一种应用于测控系统的基于Linux的嵌入式系统的设计方案,能保证测控任务完成的实时性、可靠性,可以连到工业以太网,实现远程监控,在工业控制领域有很好的应用前景。

本文作者的创新点:在嵌入式系统软件的设计与实现上,提供了开发实时应用程序的接口;利用实时应用接口(RTAI)来增强Linux的实时性,并引入实时硬件抽象层结构(rthal)、实时调度器、实时FIFO等实时服务;给出了在RTAI-Linux环境下开发工业测控系统中实时应用程序的方法

本站声明: 本文章由作者或相关机构授权发布,目的在于传递更多信息,并不代表本站赞同其观点,本站亦不保证或承诺内容真实性等。需要转载请联系该专栏作者,如若文章内容侵犯您的权益,请及时联系本站删除。
换一批
延伸阅读

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 信息技术
关闭
关闭