嵌入式系统linux总结

发布 2022-10-21 07:11:28 阅读 1714

linux进程调用shmget(shared memory get,获取共享内存)来分配一个共享内存块。shmat(shared memory attach,绑定到共享内存)。shmctl("shared memory control",控制共享内存)函数会返回一个共享内存块的相关信息。

同时 shmctl 允许程序修改这些信息。

5)信号量。

6)套接字(socket)

三、linux调度程序理解。

1. linux使用内核函数goodness()对进程进行加权处理:

static inline goodness (struct task_struct * pint this_cpu, struct mm_struct *this_mm)

int weight;

weight=-1;

if (p->policy & sched_yield)//判断如果任务的调度策略被置为sched_yield的话,则置权值为-1,返回。

goto out;

if (p->policy==sched_other) /先对普通进程进行处理(由于多数是普通进程,这样做有利于提高系统效率)*/

weight=p->counter; /返回权值为进程的counter值*/

if (!weight)

goto out;

#ifdef config_smp

if (p->processor==this_cpu)

weight+=proc_change_penalty;

#endif

if (p->mm==this_mm||!p->mm)

weight+=1; /对进程权值进行微调,如果进程的内存空间使用当前正在运行的进程的内存空间,则权值额外加1*/

weight+=20-p->nice; /将权值加上20与进程优先级nice的差。普通进程的权值主要由counter值和nice值组成*/

goto out;

weight=1000+p->rt_priority; /对实时进程进行处理,返回权值为rt_priority+1000,确保优先级高于普通进程*/

out:return weight;}

#include<>

#include<>

int main()

int n,fd[2]; 这里的fd是文件描述符的数组,用于创建管道做准备的。

pid_t pid;

char line[100];

if(pipe(fd)<0) /创建管道。

printf("pipe create error/n");

if((pid=fork())0) /利用fork()创建新进程。

printf("fork error/n");

else if(pid>0){ 这里是父进程,先关闭管道的读出端,然后在管道的写端写入“hello world"

close(fd[0]);

write(fd[1],"hello word/n",11);

else{close(fd[1]);这里是子进程,先关闭管道的写入端,然后在管道的读出端读出数据。

n= read(fd[0],line,100);

write(stdout_fileno,line,n);

exit(0);

工作队列(work queue)是linux kernel中将工作推后执行的一种机制。这种机制和bh或tasklets不同之处在于工作队列是把推后的工作交由一个内核线程去执行,因此工作队列的优势就在于它允许重新调度甚至睡眠。

工作队列是2.6内核开始引入的机制,在2.6.20之后,工作队列的数据结构发生了一些变化,数据结构:

structwork_struct {

unsigned longpending; pending是用来记录工作是否已经挂在队列上;

structlist_head entry; entry是循环链表结构;

void(*func)(void*);func作为函数指针,由用户实现;

void*data; data用来存储用户的私人数据,此数据即是func的参数;

void*wq_data; wq_data一般用来指向工作者线程(工作者线程参考下文);

structtimer_list timer; timer是推后执行的定时器。

工作队列(work queue)api:

1、init_work(_work, _func, _data);初始化指定工作,目的是把用户指定的函数_func及_func需要的参数_data赋给work_struct的func及data变量。

2、schedule_work(structwork_struct *work)对工作进行调度,即把给定工作的处理函数提交给缺省的工作队列和工作者线程。工作者线程本质上是一个普通的内核线程,在默认情况下,每个cpu均有一个类型为“events”的工作者线程,当调用schedule_work时,这个工作者线程会被唤醒去执行工作链表上的所有工作。

3、schedule_delayed_work(structwork_struct *work, unsigned longdelay);延迟执行工作,与schedule_work类似。

4、flush_scheduled_work(void);刷新缺省工作队列。此函数会一直等待,直到队列中的所有工作都被执行。

5、cancel_delayed_work(structwork_struct *work);并不取消任何延迟执行的工作,因此,如果要取消延迟工作,应该调用cancel_delayed_work。

针对linux内核,如下机制严重地影响了实时性。

linux实时改造后的系统实时性较好,典型代表有:

kurt-linux,red-linux,rt-linux、rtai和xenomai等。

rt-linux中的实时任务在运行过程当中总是处于以下三种状态之一:

安装rt-linux的方法和步骤。

在基于adeos的系统中,存在着a、b、c、d四种类型的交互。linux内核和xenomai分别作为adeos中的一个域存在。linux内核负责非实时任务的调度,而xenomai采用不同于linux的精度更高的定时中断来调度实时任务,实现更小的调度延时。

另外,xenomai域的优先级高于linux域。

xenomai除了在内核层利用adeos实现了硬实时外,它在用户空间也有很好的实时性。

xenomai的补丁及配置移植步骤。

rt-linux的实时内核的主要api

1)硬中断api

2)软中断api

3)内核实时线程编程api,主要有以下几个(在rtl_中声明):

4)要使用共享内存通信,需要在内核中插入模块,可以使用mubff_alloc() 和mbuff_free()函数申请和释放共享内存。

5)rt-linux提供的操作实时fifo的api主要有(在rtl_中声明):

几类常用的xenomai 的native api

1、任务管理。

2、内存堆服务。

3、信息管道服务。

嵌入式linux与嵌入式系统设计

ustc bbs embedded斑竹d j主讲。感谢hongtao chen以及networking斑竹jun zxjun的大量幕后工作!感谢james zhang以及网络中心提供聚会的场地和大力支持!欢迎访问我的主页。聚会详情如下 名称 嵌入式系统设计以及嵌入式linux展望 时间 本周星期天 ...

《嵌入式系统与开发》构建嵌入式Linux系统 实验报告

嵌入式qt编程设计 实验报告。学生姓名。学号。专业班级。指导教师。完成时间。实验4 嵌入式qt编程及使用。一。实验目的。理解qt信号和插槽机制,掌握利用qt creator进行图形软件设计的基本步骤,并掌握将编译好的可执行程序加载到嵌入式开发板并运行的方法。掌握qt应用程序操纵底层硬件设备的基本步骤...

嵌入式系统与开发》构建嵌入式Linux系统 实验报告

第三步,编译sqlite,命令为 make 编译过程中使用的编译器为 arm linux gcc 第四步,安装sqlit,命令为 make install 安装完成后到 opt sqlite 文件夹下去查看相关文件,可以看到该文件夹下有 bin include lib 和share文件夹,其中可执行...