ARM Linux开机后自动运行特定程序的方法

ARM Linux开机后自动运行特定程序的方法,第1张

开机后自动运行用户的应用程序或启动系统服务的命令保存在开发板根文件系统的/usr/etc/rc.local文件中。有的开发板开机后自动运行图形界面程序,需要按住ctrl+c让开发板进入到linux的SHELL提示符界面。其实可通过注释掉rc.local文件中调用图形界面的命令,增加运行用户应用程序的命令,达到开机自动运行用户应用程序的目的。

下面以我做的实验为例,描述具体的实现步骤。该方法源于网络,我加以验证,稍做修改,此文相当于转载。

1.进入pc机的linux

*** 作系统,在/nfs/usr/下通过mkdir

lz

命令新建一个名为lz的文件夹,进入lz文件夹,通过mkdir

hello新建一个hello文件夹用来存放我们将要编写的hello.c文件和编译生成的可执行文件。

2.在/nfs/usr/lz/hello下通过vi

hello.c命令新建hello.c文件,编辑如下测试程序:

#include

int

main(){

printf("Hello,test

arm-linux!")

return

0

}

完成编辑后通过:wq保存后退出。

3.主机通过如下命令交叉编译环境编译hello.c:

#arm-linux-gcc

o

hello

hello.c

4.通过ls

命令可以看到在/nfs/usr/lz/hello/下已经生成了hello可执行文件,我们可以在开发板上通过./hello来测试自己编写的hello.c执行情况

5.修改rc.local文件,在文件的最后通过‘#’释掉启动图形界面的指令,增加执行用户应用程序hello的指令,具体实现如下:

#export

PATH=$QPEDIR/bin:$PATH

#qtopia

#/usr/qtopia/bin/qtopia

/usr/lz/hello/./hello

注:前三行是注释掉启动图形界面,最后一行是添加的执行用户的hello测试程序。

6.重启开发板,通过vivi参数配置让开发板通过nfs挂载主机上的文件系统,这时我们就可以通过超级终端看到开发板已经运行了我们编写的hello程序。

在linux源代码中会有一部分c语言与汇编语言相交融的部分。

其中linux中汇编语言采用的不是我们通用的intel的汇编语言,而是采用的是AT&T格式的汇

编语言,它们之间有一些差别:

1

目标与源的方向不大一样

mov

ax,

bx

mov

%bx,

%ax

2

AT&T寄存器前要加入%

ax

%ax

3

AT&T立即数前面要加上$

add

ax,

4

add

%ax,$4

4

对于访问指令的 *** 作数大小

intel的格式是在 *** 作数前加上BYTE

PTR、DWORD

PTR等等

AT&T格式:在 *** 作数后面加上b、l、w等

MOV

AL,

BYTE

PTR

FOO(intel)

movb

FOO,

%al

(AT&T)

5

间接寻址:

SECTION:[BASE+INDEX*SCALE+DISP]

Section:disp(base,

index,

scale)

C语言中插入汇编代码比纯粹的汇编要难,因为要设计到“如何分配使用寄存器、怎样与C语

言中变量相结合”

下面“=”代表只读,“+”代表读写

每个输出部分均以=开始

比如我想定义一个char型的变量,放入ax中

register

char

_temp

asm

("ax")

register

char

_temp

__asm__

("ax")

以上两种方式均正确

在这里我们通常看到普通的寄存器前面有两个%,代表下面的意思:第一寄存器前要有一个%

第二对于一个模板前要加入一个%

下面以一个在内核中常见的目的为了实现原子 *** 作的一个函数为例子atomic_add来介绍

static

__inline__

void

atomic_add(int

i,

atomic_t

*v)

{

__asm__

__volatile__(

LOCK

"addl

%1,

%0"

:"=m"(v->counter)

:"ir"(i),

"m"(v->counter)

)

}

ir代表一个寄存器中的直接 *** 作数

首先一个头部:__asm__

__volatile__()

asm()

__asm__()告诉编译器里面是汇编语言

:第一个冒号是输出部分:第二个冒号是输入部分

其实还有第三个冒号:代表着损坏部分

asm("汇编语句"

:输出部分

:输入部分

:损坏部分)

%0、%1

等等代表着一种模板 *** 作数,其中数字到几取决于cpu寄存器数量

"m",

"v",

"o"

--内存单元

"r"

任意寄存器

"q"

表示eax、ebx、ecx、edx之一

"i",

"h"

表示立即数

"a",

"b",

"c",

"d"表示eax、ebx、ecx、edx

关键字LOCK表示在执行的时候把系统总线锁住,不让其他

cpu干扰。


欢迎分享,转载请注明来源:内存溢出

原文地址:https://54852.com/yw/11591938.html

(0)
打赏 微信扫一扫微信扫一扫 支付宝扫一扫支付宝扫一扫
上一篇 2023-05-17
下一篇2023-05-17

发表评论

登录后才能评论

评论列表(0条)

    保存