嵌入式,linux内核链表

简介: 链表是一种常用的数据结构,它通过指针 将一系列数据节点连接成一条数据链。相对于数组,链表具有更好的动态性,建立 链表时无需预先知道数据总量,可以随机分配空间,可以高效地在链表中的任意位 置实时插入或删除数据。

链表是一种常用的数据结构,它通过指针 将一系列数据节点连接成一条数据链。相对于数组,链表具有更好的动态性,建立
链表时无需预先知道数据总量,可以随机分配空间,可以高效地在链表中的任意位
置实时插入或删除数据。链表的开销主要是访问的顺序性和组织链的空间损失。
通常链表数据结构至少包含两个域:数据 域和指针域,数据域用于存储数据,指针域用于建立与下一个节点的联系。按照指针域的组织以及各个节点之间的联系形式,链表又可以分为单链表、双链表、循环链表等多种类型。
在Linux内核中使用了大量的链表结 构来组织数据。这些链表大多采用了[include/linux/list.h]中实现的一套精彩的链表数据结构。
内核链表数据结构的定义:
          struct list_head 
          { 
                struct list_head *next, *prev; 
          }; 
          list_head结构包含两个指向list_head结构的指针 prev和next,由此可见,内核的链表具备双链表功能
          初始化链表头      INIT_LIST_HEAD(list_head *head) 
          插入节点
                               list_add(struct list_head *new, struct list_head *head)            插入头指针后面
                               list_add_tail(struct list_head *new, struct list_head *head)      插入尾部
          删除节点       list_del(struct list_head *entry)

         提取数据结构 list_entry(ptr, type, member)

         遍历               list_for_each(struc list_head *pos, struc list_head *head)

时钟中断由系统的定时硬件以周期性的时间间隔产生,这个间隔(即频率)由内核根据HZ来确定,HZ是一个与体系结构无关
的常数,可配置(50-1200),在X86平台,默认值为1000。

每当时钟中断发生时,全局变量jiffies(unsigned long)就加1,因此jiffies记录了自linux启动后时钟中断发生的次数。驱动程序常利用jiffies来计算不同事件间的时间间隔。

       如果对延迟的精度要求不高,最简单的实现方法如下--忙等待:
                   unsigned long j=jiffies + jit_delay*HZ;
                   while (jiffies                     {  
                           /* do nothing */
                    }
延时jit_delay秒

内核定时器用于控制某个函数(定时器处理函数)在未来的某个特定时间执行。内核定时器注册的处理函数只执行一次--不是循环执行的。

内核定时器被组织成双向链表,并使用struct timer_list结构描述。
           struct timer_list{
                       struct list_head entry /*内核使用*/;
                       unsigned long expires; /*超时的jiffies值*/
                       void (*function)(unsigned long); /*超时处理函数*/
                       unsigned long data; /*超时处理函数参数*/
                       struct tvec_base *base; /*内核使用*/
                                 };

         void init_timer(struct timer_list *timer);      初始化定时器队列结构。
         void add_timer(struct timer_list * timer);   启动定时器。
         int del_timer(struct timer_list *timer);        在定时器超时前将它删除。当定时器超时后,系统会自动地将它删除。

相关文章
|
6月前
|
消息中间件 存储 缓存
【嵌入式软件工程师面经】Linux系统编程(线程进程)
【嵌入式软件工程师面经】Linux系统编程(线程进程)
128 1
|
6月前
|
网络协议 算法 Linux
【嵌入式软件工程师面经】Linux网络编程Socket
【嵌入式软件工程师面经】Linux网络编程Socket
182 1
|
4月前
|
NoSQL Linux C语言
嵌入式GDB调试Linux C程序或交叉编译(开发板)
【8月更文挑战第24天】本文档介绍了如何在嵌入式环境下使用GDB调试Linux C程序及进行交叉编译。调试步骤包括:编译程序时加入`-g`选项以生成调试信息;启动GDB并加载程序;设置断点;运行程序至断点;单步执行代码;查看变量值;继续执行或退出GDB。对于交叉编译,需安装对应架构的交叉编译工具链,配置编译环境,使用工具链编译程序,并将程序传输到开发板进行调试。过程中可能遇到工具链不匹配等问题,需针对性解决。
113 3
|
3月前
|
Linux
linux内核中的几种链表
linux内核中的几种链表
|
4月前
|
传感器 人工智能 网络协议
:嵌入式 Linux 及其用途
【8月更文挑战第24天】
205 0
|
5月前
|
Ubuntu 算法 Linux
嵌入式Linux的学习误区
**嵌入式Linux学习误区摘要** 1. **过度聚焦桌面Linux** - 许多学习者误将大量时间用于精通桌面Linux系统(如RedHat、Fedora、Ubuntu),认为这是嵌入式Linux开发的基石。 - 实际上,桌面Linux仅作为开发工具和环境,目标不应是成为Linux服务器专家,而应专注于嵌入式开发工具和流程。 2. **盲目阅读Linux内核源码** - 初学者在不了解Linux基本知识时试图直接研读内核源码,这往往导致困惑和挫败感。 - 在具备一定嵌入式Linux开发经验后再有针对性地阅读源码,才能有效提升技能。
|
6月前
|
物联网 Linux 芯片
学习嵌入式是选择单片机还是Linux?
单片机通常指的是一种集成了处理器、存储器和各种外设接口的微控制器芯片,常见的有STC、51系列、AVR、ARM Cortex-M等。单片机具有低成本、低功耗、实时性强等特点,适用于对资源要求较低、功耗要求较低、实时性要求较高的嵌入式系统。学习单片机开发可以让您深入了解嵌入式系统的底层原理和硬件编程,对于对嵌入式系统底层开发感兴趣的人来说,是一个很好的选择。
142 4
|
6月前
|
消息中间件 安全 Java
【嵌入式软件工程师面经】Linux多进程与多线程
【嵌入式软件工程师面经】Linux多进程与多线程
73 1
|
6月前
|
存储 缓存 Unix
【嵌入式软件工程师面经】Linux文件IO
【嵌入式软件工程师面经】Linux文件IO
52 1
|
7月前
|
Ubuntu 算法 Linux
嵌入式Linux的学习误区
该文指出了学习嵌入式Linux开发的两个常见误区。一是过分专注于学习桌面或服务器版Linux,而非关注嵌入式开发本身,实际上只需熟悉基本操作即可。二是试图在没有基础的情况下直接阅读Linux内核源代码,这是不切实际的,应先建立基础知识再进行源码学习。文章还提到了在嵌入式系统中获取和处理屏幕数据的示例,包括使用gsnap工具将framebuffer数据转为图像,以及涉及的交叉编译过程。