嵌入式培训
美国上市嵌入式培训机构

400-111-8989

热门课程

掌握嵌入式开发技能,能给嵌入式Linux打实时补丁,你才是牛人!

  • 发布:嵌入式培训
  • 来源:电子发烧友网、网络 Linux与嵌入式系统
  • 时间:2018-05-04 15:38

掌握嵌入式开发技能,能给嵌入式Linux打实时补丁,你才是牛人!

作为嵌入式工程师,想要别人给你竖起大拇哥,那你要能解决别人的问题才行,解决别人的问题,你不掌握嵌入式开发技能,不能给嵌入式Linux打实时补丁怎么行?

一、嵌入式开发技能

合格的嵌入式开发者应是多面手,应具备各方面的技能,包括从硬件到软件到应用(电力系统保护,自动化,控制,人工智能,机器学习等),从单板到系统整机,从技术到管理,甚至吹拉弹唱也需要了解一点,做项目管理时可以提升团队气氛和丰富业余生活。

嵌入式知识和技能体系庞大,样样精通者凤毛鳞角,一般都是一专多能,各类技能多少都能说上一点。按照嵌入式开发层次关系,整理嵌入式开发者技能大全如下。

1、处理器

MCU架构及开发。MCU,俗称单片机,把中央处理器(CentralProcess Unit,CPU)的频率和规格作适当删减,并将内存(Memory)、计数器(Timer)、USB、A/D转换、UART、PLC、DMA等周边接口,甚至LCD等驱动电路都整合在单一芯片上,形成芯片级的计算机,为不同的应用场合做不同的组合控制。常见的MCU包括Intel的C51/C8051F系列,Motorola的68K系列,MicroChip的PIC系列等。

MPU架构及开发。MPC指微处理单元,一般不带外围器件(如存储器阵列等),是高度集成的通用结构的处理器。典型如Intel的X86系列、飞思卡尔的PowerPC系列、P1系列,ARM架构处理器等。

DSP架构及开发。DSP采用哈佛结构,同一个时钟周期内可以多次访问存储器,多级指令执行流水结构提高了系统的执行效率,DSP芯片常用于复杂的运算,典型如TI的TMS CXX系列,ADI的SHARC系列、Blackfin系列等。

2、CPLD&FPGA架构及开发

CPLD&FPGA作为专用集成电路(ASIC)领域中的一种半定制电路而出现,既解决了定制电路的不足,又克服了原有可编程器件门电路数有限的缺点。通过可编程逻辑单元实现各种算法和组合逻辑。

基于CPLD&FPGA实现程序开发。包括RTL门级逻辑图设计,VerilogHDL程序设计,VHDL程序设计,XILINX编译软件使用,ALTERA编译软件使用,低速串、并行通信控制器设计,高速串行通信控制器设计。

3、电路设计和分析

包括模拟电路和数字电路设计,包括器件DataSheet阅读,原理图及PCB阅读等。

4、原理图/PCB设计工具

Cadence,Altium,PADS,DXP等。

5、电路仿真工具使用

Multisim,Pspice,ADS,MATLAB等。

6、分立类电子元器件工作原理和选型

电路防护类器件,阻容器件,电感磁珠,DC/DC,晶振,二极管,三极管,稳压管,光耦,MOS管,IGBT,继电器,开关和按键,LED指示灯,PCB板用接线端子,交流互感器等。

7、集成类电子元器件工作原理和选型

AD,逻辑器件,DA,运放,计数器,触发器,锁存器,译码器,SRAM,SDRAM,DDR,FLASH,EEPROM,接口芯片等。

8、失效分析与可靠性

物料的构造与工作原理,金相切片,显微观察,PCB形变测量,HALT实验技术,可靠性计算等。

9、硬件测试(器件、模件、整机)

元器件测试方法,模件、整机测试方法,元器件、模件、整机测试问题分析,国标、行标理解,EMC问题分析和解决等。

10、操作系统架构及开发环境

了解操作系统原理及基本编译原理。操作系统提供CPU资源管理、外设驱动、内存管理、线程/进程管理、文件系统、网络通讯、安全机制、界面管理等。嵌入式实时操作系统的基本特征是事件响应的快速性和确定性,在嵌入式系统中广泛应用。

通用操作系统包括windows、Unix、LInux等。目前在嵌入式领域广泛使用的操作系统包括:嵌入式实时操作系统µC/OS-II、嵌入式Linux、WindowsEmbedded、VxWorks、FreeRTOS、QNX等,以及应用在智能手机和平板电脑的Android、iOS等。

11、底层驱动开发

VxWorks操作系统驱动开发,Linux移植,Linux开发,单板DTS配置以及根文件系统生成(Buildroot),U-BOOT移植和开发,C语言开发,Python语言开发,Makefile编写,GNU编译器及工具链的使用,Linux操作系统使用。

具体包括以太网驱动,SPI驱动,I2C驱动,文件系统驱动,CAN驱动等。

12、系统软件设计

面向对象,设计模式,UML,嵌入式多任务开发,重构,多核开发等。了解常用的开发过程,如敏捷编程,测试驱动开发等。

13、系统软件开发

熟悉开发语言,包括:C,C++,C#,QT,Python,JAVA,等。熟悉WEB 开发,开发规范等。

14、数据结构与算法

常用数据结构和算法,图论算法,数字信号处理算法,小波算法等。

15、网络与通信

计算机网络原理,TCP/IP协议原理及分析,IEC61850规约(建模,MMS,SV,GOOSE等),103规约,104规约,DNP规约,Modbus协议,物联网Zigbee协议,bluetooth,wireshark等报文分析工具,环网HSR协议,网络安全等。

16、数据库

数据库原理与设计,SQLite/Access/MySQL/SQLServer/Oracle/大数据hadoop等。

17、界面和图形库

Zinc,UGL,QT,SVG,MiniGUI等。

18、应用知识(以电力系统自动化为例)

电力系统常识,继电保护知识,测控知识;智能变电站网络架构,网分,故障录波器,保信,远动等。

19、调试和测试

软件测试基础,61850规约测试,网络测试,时间管理测试,应用功能测试(继电保护功能等),ATS测试开发与使用,Labview测试程序开发等。

20、项目管理

配置管理如版本管理工具Git使用等,项目计划与任务划分,项目进度跟踪,项目协调等。

二、给嵌入式Linux打实时补丁

1. 实时系统分类

实时系统可以分为硬实时(Safety-Critical,低延时,比如几十个us内)和软实时(几百个us~几个/几十个ms),硬实时通常跟高确定性、可靠性要求同时出现,如果达不到,可能会造成重大生命或者财产损失,比如说航天飞控、汽车制动系统、精密仪器等都有较高的硬实时要求。对于软实时,可靠性要求没那么高,即使出现了延迟,造成的损失可控,比如说音频失真,视频不顺畅。

2.已有方案

Linux 本身已经有硬实时的方案,比如来自风河的 RT Linux,或者西班牙一家研究所的 XtratuM + PartiKle,还有其他的比如 Xenomai,RTAI 等。另外,内核官方还有完全抢占内核(Preempt-RT Linux)的支持,这个在某些情况下也达到了硬实时要求,改补丁现在有OSADL维护。

然后就是各种优化,包括驱动(irq, preempt disable), spin lock 等使用,中断函数线程化,mdelay 替换为 usleep_range() 等。优化时需要用到很多工具,比如 Ftrace, Perf, Cyclictest, Oscilloscope 等。

硬件本身的低延迟设计、可靠性设计等也会严重影响系统的实时性,比如说 ARM Cortex A/R/M 三系中的 R 就是专为高端嵌入式实时系统设计的,在中断行为方面做了优化。

3.OSADL方案

1)下载内核源代码和实时抢占补丁包

以内核2.6.31.5为例: linux-2.6.31.5 and patch-2.6.31.5-rt17:

# cd /usr/src/kernels

# wget http://www.kernel.org/pub/linux/kernel/v2.6/linux-2.6.31.5.tar.bz2

# wget http://www.kernel.org/pub/linux/kernel/projects/rt/patch-2.6.31.5-rt17.bz2

解压:

# tar -jxvf linux-2.6.31.5.tar.bz2

重命名目录:

# mv linux-2.6.31.5 linux-2.6.31.5-rt17

打补丁:

# bunzip2 patch-2.6.31.5-rt17.bz2

# cd linux-2.6.31.5-rt17

# patch -p1 <../patch-2.6.31.5-rt17

2)使用 ketchup脚本

# cd /usr/src/kernels

# mkdir tmp

# cd tmp

# ketchup -r -G 2.6.31.5-rt17

可以去下面的网址下载Matt Mackall's 和 Steven Rostedt 的 ketchup 脚本: http://people.redhat.com/srostedt/rt/tools/ketchup-0.9.8-rt3.

记得修改权限:

# wget -O /usr/local/bin/ketchup http://people.redhat.com/srostedt/rt/tools/ketchup-0.9.8-rt3

# chmod +x /usr/local/bin/ketchup

3)配置和编译内核

打完补丁,并编译后,将/boot/config-`uname -r`文件拷过来,成为 .config:

# cp /boot/config-`uname -r` .config

开始配置内核:

# make menuconfig

找到以下属性:

Processor type and features --->

Preemption Mode (Complete Preemption (Real-Time)) --->

比如,在"kernel hacking"设置里有Debug, trace and diagnostic 等:

Kernel hacking --->

[*] Tracers --->

--- Tracers

[*] Kernel Function Tracer

[*] Interrupts-off Latency Tracer

[*] Interrupts-off Latency Histogram

[*] Preemption-off Latency Traver

[*] Preemption-off Latency Histogram

[*] Scheduling Latency Tracer

[*] Scheduling Latency Histogram

[*] Missed timer offsets histogram

这些设置,只适用于调试和评估。在系统投入生产前最好把它们都禁掉。 然而,调度延迟和丢失的定时器抵消了直方图,只是轻微地干扰了系统,因此可以用来在生产条件下连续记录唤醒延迟。无论如何,请将stack overflow检查禁掉,因为它可能会导致附加延迟。

Kernel hacking --->

[ ] Check for stack overflows

继续编译和安装模块:

# make

# make modules_install install

系统重启后,新的内核将会出现在启动菜单里。

如果你的机器是多核的,请确保在make时使用-j <jobs>开关,这里jobs等于CPU核的个数的两倍。这个开关将加快你的内核编译速度。

4)使用和测试实时补丁

首先确认内核版本中含有PREEMPT 和 RT标志:

uname -v

#42 SMP PREEMPT RT Fri Nov 6 18:55:29 CET 2009

为了使用内置诊断工具,必须mount debug文件系统。这可以通过下面的方式:

# mount -t sysfs nodev /sys

# mount -t debugfs nodev /sys/kernel/debug

或者在文件/etc/fstab中添加下面的命令行,使得系统在启动时能自动mount debug文件系统。

nodev /sys sysfs defaults 0 0

nodev /sys/kernel/debug debugfs defaults 0 0

注:在早期内核版本里,内置诊断工具一般都是在proc文件系统里。

每个CPU的唤醒延迟直方图可以用以下方式查看(注意必须是在打完实时补丁之后才能看到):

# ls /sys/kernel/debug/tracing/latency_hist/wakeup_latency/CPU?

从版本 2.6.2.31 开始, 文件位于下面的路径:

# ls /sys/kernel/debug/tracing/latency_hist/wakeup/CPU?

# grep -v " 0$" /sys/kernel/debug/tracing/latency_hist/wakeup*/CPU0

#Minimum latency: 0 microseconds.

#Average latency: 7 microseconds.

#Maximum latency: 39 microseconds.

#Total samples: 7069336

#There are 0 samples greater or equal than 10240 microseconds

#usecs samples

0 249884

1 120023

2 338781

3 197834

4 210872

5 150366

6 45870

7 1053204

8 564637

9 273756

10 190432

11 483611

12 328509

13 44716

14 72925

15 59304

16 28927

17 10836

18 2821

19 543

20 110

21 82

22 63

23 61

24 32

25 21

26 9

27 4

28 3

29 1

30 3

31 2

32 4

33 2

39 1

默认直方图和内核函数跟踪功能都是被禁止的,要打开它们,比如唤醒延迟直方图,输入以下命令:

echo 1 >/sys/kernel/debug/tracing/latency_hist/enable/wakeup

为了重置直方图,可以使用下面的脚本:

#!/bin/sh

TRACINGDIR=/sys/kernel/debug/tracing

HISTDIR=$TRACINGDIR/latency_hist

if test -d $HISTDIR

then

cd $HISTDIR

for i in `find . | grep /reset$`

do

echo 1 >$i

done

fi

也可以到内核文档里找到一些资料: Documentation/trace/histograms.txt.

另外, Thomas Gleixner 还做了一个测试工具 cyclictest, 用来更好更具体的测量给定系统的实时性能。 你可以用下面的命令下载.。 git repository 有其他有用的实时系统工具。

下载并解压和编译工具:

# git clone git://git.kernel.org/pub/scm/linux/kernel/git/clrkwllms/rt-tests.git

# cd rt-tests

# make

如果想每一个CPU或者CPU核运行一个测试线程,请输入:

# ./cyclictest -a -t -n -p99

在一个非实时系统中,你会看到像下面这样的:

T: 0 ( 3431) P:99 I:1000 C: 100000 Min: 5 Act: 10 Avg: 14 Max: 39242

T: 1 ( 3432) P:98 I:1500 C: 66934 Min: 4 Act: 10 Avg: 17 Max: 39661

右上角的列含有最重要的信息,比如最差延迟为39.242毫秒.在一个实时嵌入式系统里,结果应该会像下面这样:

T: 0 ( 3407) P:99 I:1000 C: 100000 Min: 7 Act: 10 Avg: 10 Max: 18

T: 1 ( 3408) P:98 I:1500 C: 67043 Min: 7 Act: 8 Avg: 10 Max: 22

这意味着短期最差延迟为18微秒。

那么,延迟多少才算正常呢?cyclictest 提供了 -b 选项,如果超过了某个预设的延迟阈值,比如:

# ./cyclictest -a -t -n -p99 -f -b100

如果延迟值超过100微秒,程序会退出。 可以到/sys/kernel/debug/tracing/trace查看trace输出。如下所示:

qemu-30047 2D.h3 742805us : __activate_task+0x42/0x68 <cyclicte-426> (199 1)

qemu-30047 2D.h3 742806us : __trace_start_sched_wakeup+0x40/0x161 <cyclicte-426> (0 -1)

qemu-30047 2DNh3 742806us!: try_to_wake_up+0x422/0x460 <cyclicte-426> (199 -5)

qemu-30047 2DN.1 742939us : __sched_text_start+0xf3/0xdcd (c064e442 0)

第一列表示触发延迟的进程。如果trace输出还不是很清楚,可以提交给 OSADL Latency Fight Support Service。除了使用 cat /sys/kernel/debug/tracing/trace, lspci命令的输出和用来编译内核的 .config文件也需要提交。 OSADL的服务原则是会员优先,但会尽可能帮助每个人都处理好延迟问题。

恭喜你阅读完了本文《掌握嵌入式开发技能,能给嵌入式Linux打实时补丁,你才是牛人!》,这里的牛人其实是特指嵌入式领域的,要想成为牛人,只能拓展自己的专业知识和技能,更重要的是要具有处理问题的能力,一定的成长周期是不可避免的,如果你还有更多关于嵌入式的疑问或者想通过嵌入式培训进行提高,欢迎来达内嵌入式培训机构进行咨询。

免责声明:内容和图片源自网络,版权归原作者所有,如有侵犯您的原创版权请告知,我们将尽快删除相关内容。

预约申请免费试听课

上一篇:嵌入式培训答疑|malloc在单片机和PC上的程序中使用频率不一样的原因
下一篇:嵌入式培训之区分ARM Cortex系列处理器

入门嵌入式,看不懂电路原理图怎么办?

嵌入式工程师必知:适用于全系列单片机的硬件设计原则

学习嵌入式知识,这些你C的知识你也得掌握了!

嵌入式软件开发编程规范有哪些?我们在进行嵌入式开发编程的时候需要注意什么?

选择城市和中心
贵州省

广西省

海南省