嵌入式系统开发

发布 2022-10-21 07:34:28 阅读 1418

目录。多进程程序设计 2

1.摘要 2

2.设计目的 2

3.设计要求 2

4.设计原理 3

5.功能设计 3

5.1任务进程的建立 3

5.2子进程创建子进程 4

5.3管道通信的实现 5

5.4进程c的ls-l指令 9

6.心得体会 10

7.参考文献 10

附录:程序** 11

众所周知,目前市场火爆的是嵌入式控制系统,单片机属于嵌入式控制系统的控制器,单片机执行的任务单一,分时复用是其应用宗旨。而嵌入式系统是多个任务之间的执行,这里的任务就是指进程的启动,它意味着在操作系统进程表中注册过一个新项目,为这个新进程分配独有的数据去、指令区,在指令区中装载属于它的程序**等等。创建新进程后,原进程的执行流继续执行,新进程的执行流继续执行,新进程产生了一个新的执行流开始执行,执行流一分为二。

这要与进程更改操作区分,进程更改只不过是让执行流跳转到外部指令区中执行,等到外部指令完成后,执行流再跳回到原指令区。

本课程设计通过设计多进程程序,掌握创建多进程的方法,掌握通过有名管道实现进程之间的通信,掌握进程中运行现有程序的方法。

1) 创建子进程1及子进程2。

2) 子进程1创建子进程a、b,子进程1等待子进程a、b退出后退出。

3) 子进程a、b之间通过有名管道fifo1进行通信,实现生产者-消费者功能。

4) 子进程2创建子进程c、d,子进程c运行“ls –l”命令,子进程d通过有名管道fifo1作为消费者与进程a通信。

图1在linux系统下, 只有一个语句可以启动新进程,那就是fork函数的调用,类似于windows系统下api函数的调用。fork函数一旦被某个进程的执行流执行,会创建一个新的进程,此进程是挂名在原进程之下,被称为父进程,新生成的的进程被称为子进程。唯一不同的是,fork()语句返回给父进程的值是子进程编号,而返回给子进程的值是0。

样例参考**如下:

int main( )

pid_t child1,child2,child;

child1=fork();

child2=fork();

if(child1==-1)

printf(“child1 fork error”);

exit(1);

else if(child1==0)

printf(“i am child1n”);

样例参考**的验证:

图2通过上面子进程的创建,下面创建子进程1的子进程a、b的创建,创建原理大致相同,在实现成功建立子进程1的情况下,再创建子进程a、b的创建。

部分样例参考**如下:

else if(child1 ==0)

首先我们应该明白我们为什么要使用管道通信,了解了为什么才能明白管道通信的作用,以及以后要不要使用管道通信,和怎么使用管道通信的问题。下面我来阐述下我对此问题的理解。管道通信主要应用于要在不相关的进程间数据交换,这样我们使用fifo队列文件管理就可以实现进程间的数据交换,区别于单片机的地方也在于此,单片机暂停当前任务去执行别的任务只有靠中断完成。

fifo文件通常也称为命名管道(named pipe)。命名管道是一种特殊类型的文件,它在文件系统中以文件名的形式存在。

方式1:mknod filename p

方式2:调用mkfifo函数。

intmkfifo(constchar*pathname,mode_tmode);

intmknod(constchar*pathname,mode_tmode|s_fifo,(dev_t)0);

创建结果:图3

所谓的生产者和消费者二者的关系举个例子是这样的,生产者将货物搬上销售架,消费者是买走货物。这里面有三个物体生产者和消费者还有一个购物平台,对应到计算机的世界里生产者是数据提供的一方,而消费者是使用数据的一方,中间变量购物平台是计算机里的寄存器。

生产者样例参考**:

#definefifo_name"/tmp/my_fifo1"

#definebuffer_sizepipe_buf

#defineten_msg(1024*1024*10)

intmain()

intpipe_fd;

intres;

intopen_mode=o_wronly;

intbytes_sent=0;

charbuffer[buffer_size+1];/缓存。

printf("productorprogrambeginning...n");初始化程序。

if(access(fifo_name,f_ok)==1) /检查fifo文件是否存在。

res=mkfifo(fifo_name,0777);

if(res!=0)

fprintf(stderr,"couldnotcreatefifo%s",fifo_name);

exit(exit_failure);

printf("process%dopeningfifoo_wronly",getpid())

pipe_fd=open(fifo_name,open_mode);/检查完毕,打开fifo文件。

printf("process%dresult%d",getpid(),pipe_fd);

if(pipe_fd!=-1)

while(bytes_sentres=write(pipe_fd,buffer,buffer_size);/向fifo写入数据。

if(res==-1)

fprintf(stderr,"writeerroronpipe");

exit(exit_failure);

bytes_sent+=res;

void)close(pipe_fd);

elseexit(exit_failure);

printf("process%dfinished",getpid())

exit(exit_success);

**运行:图4

消费者样例**程序。

#definefifo_name"/tmp/my_fifo"

#definebuffer_sizepipe_buf

intmain()

intpipe_fd;

intres;

intopen_mode=o_rdonly;

charbuffer[buffer_size+1];

intbytes=0;

printf("consumerprogrambeginning...

memset(buffer,'\0',sizeof(buffer));

printf("process%dopeiningfifoo_rdonly",getpid())

pipe_fd=open(fifo_name,open_mode);

printf("process%dresult%d",getpid(),pipe_fd);

if(pipe_fd!=-1)

dores=read(pipe_fd,buffer,buffer_size);

bytes+=res;

嵌入式系统开发

1 汇编程序调用c程序 atpcs反正就是一种规则 1 汇编程序的设置要遵循atpcs规则,保证程序调用时参数能正确传递。2 在汇编程序中使用import伪指令声明将要调用的c程序函数。3 在调用c程序时,要正确设置入口参数,然后使用bl调用。2 c程序调用汇编程序。1 汇编需的设置要遵循atpcs...

嵌入式系统开发试题

2009至2010学年第 1 学期。嵌入式开发系统试卷a 一 填空题 本题 20 分,每空1分 1.嵌入式系统主要包括一下几类和 2 嵌入式操作系统现在比较流行的有和等。3.arm的v4t版本以上一般都支持两类指令集,分别为。4 arm处理器工作模式有7种,它们分别是。和模式。5 arm内部寄存器都...

嵌入式系统开发试题

一单项选择题。1.世界上第一台计算机研制成功的年代是 c 1944年 1945年 1946年 1947年。2.十进制数235,用二进制表达为 a 3.arm采用定长指令格式,所有指令都是32位,bit 31 28 为 b 目标寄存器编码 条件执行 指令操作符编码 永远是0 4.8080处理器是 c ...