字母哥先生
码龄5年
关注
提问 私信
  • 博客:29,737
    29,737
    总访问量
  • 68
    原创
  • 379,904
    排名
  • 413
    粉丝
  • 0
    铁粉

个人简介:痛苦的本质来源于你对现状的不满,焦虑的本质来源于你成长速度太慢。

IP属地以运营商信息为准,境内显示到省(区、市),境外显示到国家(地区)
IP 属地:福建省
  • 加入CSDN时间: 2019-12-29
博客简介:

m0_46112340的博客

查看详细资料
个人成就
  • 获得484次点赞
  • 内容获得16次评论
  • 获得458次收藏
  • 代码片获得106次分享
  • 博客总排名379,904名
创作历程
  • 45篇
    2024年
  • 30篇
    2023年
成就勋章
TA的专栏
  • LV6 并发程序设计
    12篇
  • LV4 数据结构
    6篇
  • lv17
    3篇
  • LV16 驱动开发高级
    4篇
  • LV15 驱动开发中级
    12篇
  • STM32学习笔记
    2篇
  • LV14驱动开发初级
    4篇
  • LV12 ARM体系结构与接口技术
    20篇
  • 力扣算法学习
    2篇
  • LV9 网络编程下
    2篇
  • LV8--网络编程
    2篇
  • LV7---Flappy Bird
    1篇
兴趣领域 设置
  • 编程语言
    c语言
  • 嵌入式
    单片机stm3251单片机proteusmcu物联网嵌入式硬件
创作活动更多

『技术文档』写作方法征文挑战赛

在技术的浩瀚海洋中,一份优秀的技术文档宛如精准的航海图。它是知识传承的载体,是团队协作的桥梁,更是产品成功的幕后英雄。然而,打造这样一份出色的技术文档并非易事。你是否在为如何清晰阐释复杂技术而苦恼?是否纠结于文档结构与内容的完美融合?无论你是技术大神还是初涉此领域的新手,都欢迎分享你的宝贵经验、独到见解与创新方法,为技术传播之路点亮明灯!

55人参与 去参加
  • 最近
  • 文章
  • 代码仓
  • 资源
  • 问答
  • 帖子
  • 视频
  • 课程
  • 关注/订阅/互动
  • 收藏
搜TA的内容
搜索 取消

【共享内存和信号量】

(2)V(sv):我们将释放信号量称为V操作,释放信号量的本质就是归还临界资源中某块资源的使用权限,当释放成功时临界资源中资源的数目就应该加一,因此V操作本质就是让计数器加一,如果有其他进程因等待sv而被挂起,就让它恢复运行,如果没有进程因等待sv而挂起,就给他加1。(1)P(sv):我们将申请信号量称为P操作,申请信号量的本质就是申请获得临界资源中某块资源的使用权限,当申请成功时临界资源中资源的数目应该减去一,因此P操作的本质就是让计数器减一,如果sv的值大于零,就给它减1;通常用于获取资源的使用权;
原创
发布博客 2024.05.23 ·
1051 阅读 ·
20 点赞 ·
0 评论 ·
6 收藏

【bug 记录】

如果pthread_mutex_unlock在while外面,则需要再if里面解锁,不然cmd一直被锁住无法修改,风扇无法关闭,如果在while里面则不用在if里面解锁。ioctl传参的时候cmd的数据类型unsigned char会报错,case语句超出unsigned char最大值,if(){} if(){} 会判断所有条件是否成立,互不干预,并都会去执行判断一次;当先开启数码管响应后,再去控制led,led控制会被数码管的响应覆盖;所以在数码管的条件语句中需要添加一句将数码管指令赋值为0x70;
原创
发布博客 2024.05.17 ·
237 阅读 ·
3 点赞 ·
0 评论 ·
0 收藏

【线程同步与互斥】

pthread_create()之前的全局资源—>有线程操作的全程资源—>变为临界资源。线程间互斥===有你没他(无执行顺序,CPU调度到哪个线程就哪个线程执行)静态变量,全局变量,系统资源。线程间同步===有序执行。条件变量+互斥锁(同步)同步和互斥是为了什么?2.条件变量+互斥锁。
原创
发布博客 2024.05.14 ·
202 阅读 ·
1 点赞 ·
0 评论 ·
0 收藏

【I2C总线驱动】

Inter-Integrated Circuit: 字面意思是用于“集成电路之间”的通信总线,简写:IIC(或者I2C)i2c传输的要点就是: 传输一个字节 后面必然紧跟一个"响应"信号----应答信号.这个响应信号可能来自主机,或者是从机,具体是谁,就要看传输方向。传输方向分两种情况(每种情况又有两种可能: A无应答和 B有应答):1.主机->从机,主机对从机发一个字节之后,主机要读取从机的响应信号(主机读SDA线)
原创
发布博客 2024.04.08 ·
676 阅读 ·
22 点赞 ·
0 评论 ·
9 收藏

【LV16 Day3 平台总线开发 ID匹配和设备树匹配】

id匹配(可想象成八字匹配):一个驱动可以对应多个设备 ------优先级次低用到结构体数组,一般不指定大小,初始化时最后加{}表示数组结束设备中增加资源,驱动中访问资源。
原创
发布博客 2024.03.30 ·
293 阅读 ·
7 点赞 ·
0 评论 ·
4 收藏

【LV16 day2 平台总线驱动开发---名称匹配】

​ driver模块中,struct platform_driver成员driver的name成员必须指定,但与device模块中name可以不相同。初期方案,各种device需要编码方式注册进内核中的设备管理结构中,为了进一步减少这样的编码,引进设备树。2.2 id匹配(可想象成八字匹配):一个驱动可以对应多个设备 ------优先级次低。2.3 设备树匹配:内核启动时根据设备树自动产生的设备 ------ 优先级最高。​ 带来的问题-------怎样将二者进行关联(匹配)?
原创
发布博客 2024.03.30 ·
888 阅读 ·
6 点赞 ·
0 评论 ·
10 收藏

【LV16 day1 自动mknod】

仅devfs,导致开发不方便以及一些功能难以支持:热插拔。
原创
发布博客 2024.03.30 ·
776 阅读 ·
10 点赞 ·
0 评论 ·
13 收藏

【LV15 day15 中断上半部和中断下半部】

起源:struct tasklet_struct{​ struct tasklet_struct *next;​ unsigned long state;​ atomic_t count;​ void (*func)(unsigned long);​ unsigned long data;};void tasklet_func(unsigned long data);6.4 调度tasklet三、按键驱动之tasklet版四、下半部机制之workqueue ----- 基于内
原创
发布博客 2024.03.29 ·
311 阅读 ·
5 点赞 ·
0 评论 ·
8 收藏

【LV15 day14 中断处理:按键驱动程序编写】

一种硬件上的通知机制,用来通知CPU发生了某种需要立即处理的事件。
原创
发布博客 2024.03.26 ·
358 阅读 ·
4 点赞 ·
0 评论 ·
6 收藏

【Day14 LED驱动设备树版】

减少垃圾代码减轻驱动开发工作量驱动代码和设备信息分离参考Open Fireware设计用来记录硬件平台中各种硬件设备的属性信息。
原创
发布博客 2024.03.21 ·
943 阅读 ·
27 点赞 ·
1 评论 ·
15 收藏

【内核内存管理、动态分配及IO访问、LED驱动】

内核将物理内存等分成N块4KB,称之为一页,每页都用一个struct page来表示,采用伙伴关系算法维护内核地址空间划分图:3G~3G+896M:低端内存,直接映射 虚拟地址 = 3G + 物理地址​ 细分为:ZONE_DMA、ZONE_NORMAL大于3G+896M:高端内存​ 细分为:vmalloc区、持久映射区、固定映射区。
原创
发布博客 2024.03.20 ·
859 阅读 ·
8 点赞 ·
0 评论 ·
27 收藏

【LV15 day10 信号量 互斥锁】

b.初始化信号量 void sema_init(struct semaphore *sem, int val);c.获得信号量P int down(struct semaphore *sem);c.释放互斥体 void mutex_unlock(struct mutex *lock);b.获取互斥体 void mutex_lock(struct mutex *lock);d.释放信号量V void up(struct semaphore *sem);
原创
发布博客 2024.03.12 ·
210 阅读 ·
2 点赞 ·
0 评论 ·
0 收藏

【lv15 day9 原子变量和自旋锁的应用】

e.操作并测试:运算后结果为0则返回真,否则返回假 int atomic_inc_and_test(atomic_t *v);原子变量:存取不可被打断的特殊整型变量 a.设置原子量的值 void atomic_set(atomic_t *v,int i);//原子变量增加i void atomic_sub(int i,atomic_t *v);
原创
发布博客 2024.03.11 ·
1567 阅读 ·
45 点赞 ·
0 评论 ·
29 收藏

【LV15 DAY8 多路复用及信号驱动】

static int hello_fasync(int fd, struct file *filp, int mode) //函数名初始化给struct file_operations的成员.fasync。当timeout不为NULL时,如超时设置为0,则select为非阻塞,超时设置 > 0,则无描述符可被操作的情况下阻塞指定长度的时间。void input_handler(int signum)//应用自己实现的信号处理函数,在此函数中完成读写。//将描述符设置给对应进程,好由描述符获知PID。
原创
发布博客 2024.03.09 ·
1821 阅读 ·
23 点赞 ·
0 评论 ·
50 收藏

【LV15 DAY7 阻塞和非阻塞】

init_waitqueue_head(wait_queue_head_t *pwq) //初始化等待队列头。返回:正常唤醒返回0,信号唤醒返回非0(此时读写操作函数应返回-ERESTARTSYS)​ open时由O_NONBLOCK指示read、write时是否阻塞。wait_queue_head_t //等待队列头数据类型。功能:条件不成立则让任务进入浅度睡眠,直到条件成立醒来。一、五种IO模型------读写外设数据的方式。非阻塞:不能操作就返回错误。驱动层:通过等待队列。
原创
发布博客 2024.03.09 ·
426 阅读 ·
5 点赞 ·
0 评论 ·
6 收藏

【stm32 外部中断】

中断:在主程序运行过程中,出现了特定的中断触发条件(中断源),使得CPU暂停当前正在运行的程序,转而去处理中断程序,处理完成后又返回原来被暂停的位置继续运行。中断嵌套:当一个中断程序正在运行时,又有新的更高优先级的中断源申请中断,CPU再次暂停当前中断程序,转而去处理新的中断程序,处理完成后依次进行返回。中断优先级:当有多个中断源同时申请中断时,CPU会根据中断源的轻重缓急进行裁决,优先响应更加紧急的中断源。
原创
发布博客 2024.03.09 ·
328 阅读 ·
2 点赞 ·
0 评论 ·
0 收藏

【LV15 DAY6 ioctl】

dir(direction),ioctl 命令访问模式(属性数据传输方向),占据 2 bit,可以为 _IOC_NONE、_IOC_READ、_IOC_WRITE、_IOC_READ | _IOC_WRITE,分别指示了四种访问模式:无数据、读数据、写数据、读写数据;type(device type),设备类型,占据 8 bit,在一些文献中翻译为 “幻数” 或者 “魔数”,可以为任意 char 型字符,例如 ‘a’、’b’、’c’ 等等,其主要作用是使 ioctl 命令有唯一的设备标识;
原创
发布博客 2024.03.07 ·
847 阅读 ·
18 点赞 ·
0 评论 ·
5 收藏

LV15 day5 字符设备驱动读写操作实现

ppos:对于需要位置指示器控制的设备操作有用,用来指示读取的起始位置,读完后也需要变更位置指示器的指示位置。ppos:对于需要位置指示器控制的设备操作有用,用来指示写入的起始位置,写完后也需要变更位置指示器的指示位置。filp:指向open产生的struct file类型的对象,表示本次write对应的那次open。filp:指向open产生的struct file类型的对象,表示本次read对应的那次open。pbuf:指向用户空间一块内存,用来保存被写的数据。在通过应用层app调用。
原创
发布博客 2024.03.07 ·
470 阅读 ·
3 点赞 ·
0 评论 ·
7 收藏

【LV14 day4 字符设备驱动基础框架】

应用层app系统调用open函数使用文件名,struct inode查询是否有该文件名的对象,若没有则创建,有则查询该设备的设备好devno对应的cdev对象,再通过cdev对象得到操作函数集fops,然后open函数创建struct file对象将操作函数集设置到该对象下面的成员f_ops里面,再把struc file对象填到描述符数组里面,得到文件描述符,同时调用驱动程序的drive_open函数,再通过system_open函数返回文件描述符给到应用层的open函数。
原创
发布博客 2024.03.01 ·
698 阅读 ·
17 点赞 ·
0 评论 ·
5 收藏

【LV15 day3 注册字符设备】

五、注册字符设备struct cdev{struct kobject kobj;//表示该类型实体是一种内核对象struct module *owner;//填THIS_MODULE,表示该字符设备从属于哪个内核模块const struct file_operations *ops;//指向空间存放着针对该设备的各种操作函数地址struct list_head list;//链表指针域dev_t dev;//设备号unsigned int count;//设备数量};自己定义的结构体中必须有
原创
发布博客 2024.02.29 ·
752 阅读 ·
22 点赞 ·
0 评论 ·
6 收藏
加载更多