LDD3学习9--数据类型和定时器

这部分对应的是第七章和第十一章,因为内容也不是很多,就一起写了。里面的内容基本上就是一个个的点,所以也就一个个点简单总结一下。

1 数据类型

1.1 数据长度

不同操作系统类型长度可能不一样,看图的话最好用u8,u16,u32,u64。

内存页最好使用PAGE_SIZE,而不要使用4K,因为很多平台可能不是4K。

1.2 字节序大小端

这个在网络编程涉及到也很多,用的时候查一下就知道了。

1.3 数据对齐

书里面说的是最后加一个__attribute__ ((packed)) scsi;,这个是取消对齐,不过我记得在一般常用的时候,都是手动指定对齐:

struct BitFieldStruct {
    unsigned int a : 4;  // 占用 4 位
    unsigned int b : 3;  // 占用 3 位
    unsigned int c : 1;  // 占用 1 位
};

具体用的时候再看吧。。

1.4 判断指针

不要用NULL,用ERR_PTR,IS_ERR,PTR_ERR。

1.5 链表

这个不用自己搞,用内核里面的<linux/list.h>

2 定时器

内核通过定时器中断来跟踪时间的流动,大部分平台运行在 100 或者 1000 中断每秒; 流行的 x86 PC 缺省是 1000。

2.1 定时器

一般用的是 jiffies定时器,是在<linux/jiffies.h>。用法就不多写了,要用的时候搜一下或者GPT,答案都很标准。

高进度的定时器,可以用TSC,例子是:

unsigned long ini, end;
rdtscl(ini); rdtscl(end);
printk("time lapse: %li\n", end - ini); 

两者的区别:

特性TSC 定时器jiffies 定时器
依赖硬件依赖 CPU 硬件支持不依赖硬件,完全由内核实现
精度纳秒级毫秒级
性能非常高效开销较小,但需依赖时钟中断
多核一致性可能存在问题无多核一致性问题
功耗较高(高频访问可能增加功耗)较低(只在时钟中断时更新)
时间跨度通常不适合长时间跨度可用于长时间跨度(只需考虑溢出)
典型场景高精度时间戳,性能测量,延迟计算调度、内核延迟、一般计时需求

2.2 当前时间

获取当前时间,时间戳,这些和应用层好像差不多,就不多说了。

延迟,在应用层,基本上就是一个sleep打天下。在内核好像东西多了不少。

long wait_event_interruptible_timeout(wait_queue_head_t *q, condition, signed long timeout);这个是用在条件变量。

signed long schedule_timeout(signed long timeout);这个会让当前任务进行休眠,但是会被唤醒,比如信号量。

例子:

#include <linux/jiffies.h>
#include <linux/sched.h>
#include <linux/delay.h>

void example_function(void) {
    long timeout = msecs_to_jiffies(100); // 将100毫秒转换为jiffies
    set_current_state(TASK_INTERRUPTIBLE); // 设置当前任务状态为可中断睡眠
    schedule_timeout(timeout); // 让当前任务睡眠指定的时间
}

ndelay,udelay,mdelay。这几个都是让CPU空转,会占用很多CPU资源。所以只能用在短时间。

msleep。基于调度器调度,不会占用太多CPU资源。

2.3 内核定时器

定义是在<linux/timer.h>,让内核在指定时间后执行某个任务,某个事件或函数。通过timer_list结构,使用 init_timer() 或 timer_setup() 初始化定时器。 使用 add_timer() 启动定时器。 使用 del_timer() 删除定时器。

例子:

void setup_my_timer(void) {
    timer_setup(&my_timer, my_timer_callback, 0);
    my_timer.expires = jiffies + msecs_to_jiffies(1000); // 设置定时1秒
    add_timer(&my_timer);
}

2.4 Tasklets机制

Tasklets 是 Linux 内核中一种轻量级的底半部(Bottom Half)机制,专门用于在软中断(SoftIRQ)上下文中执行延迟处理任务。它可以延迟执行某些非时间敏感的任务,而不会阻塞中断处理程序(Top Half)。

这里有一个例子:

#include <linux/module.h>
#include <linux/kernel.h>
#include <linux/interrupt.h>

MODULE_LICENSE("GPL");
MODULE_AUTHOR("Your Name");
MODULE_DESCRIPTION("Simple Tasklet Example");

// Tasklet 函数
void my_tasklet_func(unsigned long data) {
    printk(KERN_INFO "Tasklet executed! Data: %lu\n", data);
}

// 定义 Tasklet,初始化时指定执行函数和参数
DECLARE_TASKLET(my_tasklet, my_tasklet_func, 42);

// 模块加载时调用
static int __init tasklet_example_init(void) {
    printk(KERN_INFO "Tasklet example module loaded.\n");

    // 调度 Tasklet
    tasklet_schedule(&my_tasklet);
    printk(KERN_INFO "Tasklet scheduled.\n");

    return 0;
}

// 模块卸载时调用
static void __exit tasklet_example_exit(void) {
    // 确保 Tasklet 在卸载前被销毁
    tasklet_kill(&my_tasklet);
    printk(KERN_INFO "Tasklet example module unloaded.\n");
}

module_init(tasklet_example_init);
module_exit(tasklet_example_exit);

运行结果如下:


[553563.141606] Tasklet example module loaded. //insmod
[553563.141615] Tasklet scheduled.
[553563.141618] Tasklet executed with data: 42
[553595.066381] Tasklet example module unloaded. //rmmod

看看代码就基本明白,tasklet其实就是将任务提交给CPU调度。比如说收到一个网络包,中断处理中收到包,之后还有繁琐的解包操作,如果还是占用中断,会阻塞其它任务。这个是可以调用tasklet来处理,不用全部占用CPU,提高系统整体性能。

这样中断的前半部分就是硬中断,后半部分就是软中断,tasklet这些。

例子:

irqreturn_t my_interrupt_handler(int irq, void *dev_id)
{
    // 检查中断源是否来自预期设备
    if (check_device_irq(irq)) {
        // 读取设备状态寄存器
        unsigned int status = read_device_status();
        // 清除中断标志
        clear_device_irq(irq);
        // 做一些简单的处理,如将数据从设备缓冲区拷贝到内存的临时位置
        copy_data_from_device();
        // 触发中断下半部处理
        schedule_delayed_work(&my_work, msecs_to_jiffies(10));
        return IRQ_HANDLED;
    }
    return IRQ_NONE;
}

2.5 工作队列

在#include <linux/workqueue.h>中。create_workqueue,create_singlethread_workqueue,DECLARE_WORK,INIT_WORK,PREPARE_WORK。。。

说实话之前也没用过这个,查了一下,本质上就是优先级更低的tasklet,可以被内核调度,适用于耗时更长,可以阻塞的任务。不过貌似现在要被kthread替代了。

最后:之前知乎看到一篇写定时器的,写的哇塞:C/C++中如何稳定地每隔5ms执行某个函数?

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/956413.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

python http server运行Angular 单页面路由时重定向,解决404问题

问题 当Angular在本地ng server运行时候&#xff0c;可以顺利访问各级路由。 但是运行ng build后&#xff0c;在dist 路径下的打包好的额index.html 必须要在服务器下运行才能加载。 在服务器下我们第一次访问路由页面时是没有问题的&#xff0c;但是尝试刷新页面或手动输入路…

SparkSQL数据源与数据存储

文章目录 1. 大数据分析流程2. Spark SQL数据源2.1 SparkSQL常见数据源2.2 SparkSQL支持的文本格式2.3 加载外部数据源步骤 3. 本地文件系统加载数据3.1 本地文件系统加载JSON格式数据3.1.1 概述3.1.2 案例演示 3.2 本地文件系统加载CSV格式数据3.2.1 概述3.2.2 案例演示 3.3 本…

LLM - 大模型 ScallingLaws 的 CLM 和 MLM 中不同系数(PLM) 教程(2)

欢迎关注我的CSDN&#xff1a;https://spike.blog.csdn.net/ 本文地址&#xff1a;https://spike.blog.csdn.net/article/details/145188660 免责声明&#xff1a;本文来源于个人知识与公开资料&#xff0c;仅用于学术交流&#xff0c;欢迎讨论&#xff0c;不支持转载。 Scalin…

AI agent 在 6G 网络应用,无人机群控场景

AI agent 在 6G 网络应用,无人机群控场景 随着 6G 时代的临近,融合人工智能成为关键趋势。借鉴 IT 行业 AI Agent 应用范式,提出 6G AI Agent 技术框架,包含多模型融合、定制化 Agent 和插件式环境交互理念,构建了涵盖四层结构的框架。通过各层协同实现自主环境感知等能力…

信息奥赛一本通 1168:大整数加法

这道题是一道大整数加法&#xff0c;涉及到高精度的算法&#xff0c;比如说有两个数要进行相加&#xff0c;1111111111111111111111111111111111111112222222222222222222222222222222&#xff0c;那么如果这两个数很大的话我们常用的数据类型是不能进行计算的&#xff0c;那么…

基于YOLOv4与Tkinter的口罩识别系统

往期精彩 基于YOLOv11的番茄成熟度实时检测系统设计与实现 用YOLOv11检测美国手语&#xff1a;挥动手腕的科技魔法 基于YOLOv11模型PyQt的实时鸡行为检测系统研究 OpenCV与YOLO在人脸识别中的应用研究(论文源码) 计算机视觉&#xff1a;农作物病虫害检测系统&#xff1a;基于Y…

机器学习:监督学习与非监督学习

监督学习是利用带有标签的数据进行训练,模型通过学习输入和输出之间的关系来进行预测。也就是说,数据集中既有输入特征,也有对应的输出标签,模型的目标是找到从输入到输出的映射关系。 而无监督学习则使用没有标签的数据进行训练,模型的任务是发现数据中的内在结构或模式…

【unity进阶篇】不同Unity版本对应的C# 版本和API 兼容级别(Api Compatibility Level)选择

考虑到每个人基础可能不一样&#xff0c;且并不是所有人都有同时做2D、3D开发的需求&#xff0c;所以我把 【零基础入门unity游戏开发】 分为成了C#篇、unity通用篇、unity3D篇、unity2D篇。 【C#篇】&#xff1a;主要讲解C#的基础语法&#xff0c;包括变量、数据类型、运算符、…

H3CNE-13-静态路由(二)

1.路由优先级 路由类型DirectOSPFStaticRIP管理距离01060100 2.路由度量 配置示例&#xff1a; 配置接口IP、静态路由&#xff08;去包、回包&#xff09; 3.静态路由之路由备份 RTB: ip route-static 192.168.1.0 24 10.0.12.1 ip route-ststic 192.168.1.0 24 20.0.12.1 …

【数据分享】1929-2024年全球站点的逐年平均气温数据(Shp\Excel\无需转发)

气象数据是在各项研究中都经常使用的数据&#xff0c;气象指标包括气温、风速、降水、湿度等指标&#xff0c;其中又以气温指标最为常用&#xff01;说到气温数据&#xff0c;最详细的气温数据是具体到气象监测站点的气温数据&#xff01;本次我们为大家带来的就是具体到气象监…

[Qualcomm]Qualcomm MDM9607 SDK代码下载操作说明

登录Qualcomm CreatePoing Qualcomm CreatePointhttps://createpoint.qti.qua

PID控制算法原理,并用python实现演示

PID算法控制运用在哪些地方&#xff1f; PID&#xff1a;比列(Proportion)&#xff0c;积分(Integral)&#xff0c;微分(Differential) PID算法可以用来控制温度&#xff0c;压强&#xff0c;流量&#xff0c;化学成分&#xff0c;速度等等。汽车的定速巡航&#xff1b;伺服驱…

C语言之文本加密程序设计

&#x1f31f; 嗨&#xff0c;我是LucianaiB&#xff01; &#x1f30d; 总有人间一两风&#xff0c;填我十万八千梦。 &#x1f680; 路漫漫其修远兮&#xff0c;吾将上下而求索。 文本加密程序设计 摘要&#xff1a;本文设计了一种文本加密程序&#xff0c;旨在提高信息安…

数字图像处理:实验二

任务一&#xff1a; 将不同像素&#xff08;32、64和256&#xff09;的原图像放大为像素大 小为1024*1024的图像&#xff08;图像自选&#xff09; 要求&#xff1a;1&#xff09;输出一幅图&#xff0c;该图包含六幅子图&#xff0c;第一排是原图&#xff0c;第 二排是对应放大…

latin1_swedish_ci(latin1 不支持存储中文、日文、韩文等多字节字符)

文章目录 1、SHOW TABLE STATUS WHERE Name batch_version;2、latin1_swedish_ci使用场景注意事项修改字符集和排序规则修改表的字符集和排序规则修改列的字符集和排序规则修改数据库的默认字符集和排序规则 3、ALTER TABLE batch_version CONVERT TO CHARACTER SET utf8mb4 C…

基于微信小程序的安心陪诊管理系统

作者&#xff1a;计算机学姐 开发技术&#xff1a;SpringBoot、SSM、Vue、MySQL、JSP、ElementUI、Python、小程序等&#xff0c;“文末源码”。 专栏推荐&#xff1a;前后端分离项目源码、SpringBoot项目源码、Vue项目源码、SSM项目源码、微信小程序源码 精品专栏&#xff1a;…

如何将自己本地项目开源到github上?

环境&#xff1a; LLMB项目 问题描述&#xff1a; 如何将自己本地项目开源到github上&#xff1f; 解决方案&#xff1a; 步骤 1: 准备本地项目 确保项目整洁 确认所有的文件都在合适的位置&#xff0c;并且项目的 README.md 文件已经完善。检查是否有敏感信息&#xff0…

CSS笔记01

黑马程序员视频地址&#xff1a; 前端Web开发HTML5CSS3移动web视频教程https://www.bilibili.com/video/BV1kM4y127Li?vd_source0a2d366696f87e241adc64419bf12cab&spm_id_from333.788.videopod.episodes 目录 引入方式 CSS特性 继承性 层叠性 优先级 Emmet写法 …

【机器学习】制造业转型:机器学习如何推动工业 4.0 的深度发展

我的个人主页 我的领域&#xff1a;人工智能篇&#xff0c;希望能帮助到大家&#xff01;&#xff01;&#xff01;&#x1f44d;点赞 收藏❤ 引言 在当今科技飞速发展的时代&#xff0c;制造业正经历着前所未有的变革&#xff0c;工业4.0的浪潮席卷而来。工业4.0旨在通过将…

【游戏设计原理】72 - 学习曲线

学习曲线的观点本质上强调了玩家在游戏中逐渐掌握新技能的过程&#xff0c;旨在通过设计合适的难度和反馈机制&#xff0c;确保玩家在学习的过程中感受到挑战&#xff0c;同时又不会感到过于困难或无聊。 1. 学习曲线的定义和重要性 学习曲线反映了玩家在完成某个任务时&…