- 博客(22)
- 资源 (2)
- 收藏
- 关注
原创 Linux CLK驱动笔记
clk_register首先初始化clk_ops,clk_core_populate_parent_map初这个函数主要是根据parent_num申请了clk_parent_map,则将parent_names[i]字符串赋值给了clk_parent_map的name。clk的parent是在__clk_init_parent的时候被填充的,没有全部填充,先执行get_parent获取index,然后执行clk_core_fill_parent_index填充当前的parent。
2023-11-29 19:03:04 1364
原创 Linux PWM驱动
pwm_chip代表具体的pwm控制器,通过pwmchip_add注册进内核,根据npwm变量知道多少路输出来分配pwm_device,pwm_device代表具体的某一路PWM输出,device驱动就是获取某一路具体的pwm_device然后设置pwm_status,在调用pwm_chip的apply、config、disable、enable等函数。
2023-11-15 14:21:25 177
原创 uboot调试笔记三
由于PRE_CONSOLE_BUFFER没有定义,print_pre_console_buffer为空。init_sequence_f是一个函数序列,可参考(https://blog.csdn.net/iriczhao/article/details/125859426)_DEBUG的宏默认为0,该宏为1的时候会通过printf打印信息,这个函数打印代码段和bss段的信息,如图所示。gd->mon_len这里为000894a0,注意,由于调试期间一直在改uboot代码,mon_len大小会变。
2023-04-23 23:54:02 338
原创 uboot调试笔记二
这个函数有一个参数,为r0的值,即sp指针地址,为0x60000f10,其中SYS_MALLOC_F_LEN=0x400,再include/generated/autoconf.h中定义,top先减去0x400,再减去global_data结构体16字节向上取整,然后在返回top,top返回为0x60000a20。env_driver_lookup函数会根据一个下面的枚举来查找环境变量存放的设备和优先级,只有CONFIG_ENV_IS_IN_FLASH是被定义了的,就将相应的字段置为1。
2023-04-22 13:02:06 484
原创 uboot调试笔记一(vexpress-a9)
SCTRL寄存器的bit13如下所示,置1表示异常向量表地址为0x0000ffff,且无法重新映射,为0异常向量地址为0x00000000,可重新映射。通过CRn、opc1、CRm、opc2四个字段来标识具体的寄存器,通过MRC和MCR指令进行通用寄存器和协处理器寄存器之间的数据拷贝。c12、0、c0、0为VBAR寄存器,将_start的地址放入到VBAR寄存器即为异常向量表地址。uboot下载地址:http://ftp.denx.de/pub/u-boot/我下的版本的2023-01。
2023-04-19 15:06:35 932 1
原创 linux内存管理一
Linux 内存管理文件描述符文件读写过程ARM处理器工作模式文件描述符 linux中一切接文件,而所有文件都通过文件描述符来操作,文件描述符是一个非负的整数,每当打开现有文件或者创建新文件,内核会像进程都会返回一个文件描述符,一个新创建的进程中,默认有三个文件描述符,0、1、2,如果创建或者打开新的文件,则会返回3,即没增加一个文件,则该进程返回的文件描述符+1。 每个进程都有一个文件描述符的表,用来管理文件描述符,父进程如果fork子进程的话,子进程会继承这个文件描述符的表。相同的文件可以有不
2022-05-29 16:18:20 216
原创 ARM工作模式及寄存器
ARM工作模式及汇编ARM指令集CPU组成ARM处理器模式ARM指令集ARM支持三种指令集:ARM指令集:32位指令集(每个指令通过32位表示,即机器码为4字节),比较庞大和复杂Thumb指令集:16位指令集,指令更精简,但是代码密度高,且性能更低cortex-A系列及以上的处理器支持Thumb-2指令集,16和32位混合指令集CPU组成ALU单元:运算器控制器CPU内存寄存器CPU内部总线(控制、数据、地址)ARM处理器模式不同的ARM系列模式不同,Cortex-M系列有7
2022-05-22 13:45:10 1236
原创 CCS编译器常见错误及解决
CCS编译器常见错误及解决1.理解C语言代码编译流程预处理1.理解C语言代码编译流程预处理 预处理处理宏定义和头文件,源文件中包含的头文件会在源文件里展开。源文件主要是需要头文件中的外部变量和函数的声明,这样源文件在后面的链接时才知道需要去库文件或者外部的目标文件中编译器会进行优化,如果源文件中没有用到的变量和函数声明生成目标文件的时候是没有的,所以包含多个头文件是不影响文件大小的。这里...
2022-05-12 09:55:31 8361
原创 linux pthread多线程-2
linux pthread多线程-21.pthread_cancel2.线程同步控制-互斥锁3.线程同步控制-读写锁4.线程同步控制-自旋锁5.线程同步控制-信号量6.线程同步控制-条件变量1.pthread_cancel pthread_cancel() 时用来线程退出的,但是在使用的时候有很多注意的地方,甚至是不建议使用。例如:static void* pthread_func1(void* arg){ while(1) { printf("haha\n");
2022-05-09 22:10:29 560
原创 等待队列原理
linux等待队列linux等待队列等待队列初始化linux等待队列 linux某个进程需要获取资源,例如网卡数据或者文件资源,但是他们正在被其他的进程占用或者还没有,这个时候内核必须切换到其他进程运行,直到资源准备好再唤醒进程。 waitqueue (等待队列) 就是内核用于管理等待资源的进程,当某个进程获取的资源没有准备好的时候,可以通过调用 add_wait_queue() 函数把进程添加到 waitqueue 中,然后切换到其他进程继续执行。当资源准备好,由资源提供方通过调用 wake
2022-05-02 23:53:33 843
原创 linux进程
linux进程管理进程进程描述符进程状态进程 程序是在存放在磁盘上的一个二进制文件,而将这个程序加载到了内存中运行则为进程。进程描述符 Linux进程使用struct task_struct来描述 struct task_struct { /* * offsets of these are hardcoded elsewhere - touch with care */ volatile long state; /* -1 unrunnable, 0 runnable, >0 s
2022-04-30 22:35:50 358
原创 vscode+gdb远程调试
vscode+gdb远程调试例程代码server.cclient.c编译代码GDB调试程序开启gdbserver服务例程代码server.c#include<stdio.h>#include<stdlib.h>#include<unistd.h>#include<string.h>#include<assert.h>#include<netinet/in.h>#include<sys/types.h>#i
2022-04-05 02:59:58 1982
原创 (linux pthread多线程)
linux pthread多线程1.指定头文件和编译使库文件2.申明线程ID3.设置CPU亲和属性4.创建线程函数5.线程同步1.指定头文件和编译使库文件#include<pthread.h>C语言的pthread库效率要比C++的pthread类高,C++中的pthread类底层也是调用的C的pthread库,引入头文件#include<pthread.h>,使用make编译代码时要使用gcc -pthread,若使用cmake时要指定target_link_librari
2022-03-31 19:58:03 782
原创 linux pinctrl驱动分析
linux pinctrl驱动分析 altas200模块准备设备树节点pinctrl驱动分析pcs_probe函数准备 使用的源码包为华为官方的ascend200AI加速模块的SDK,其下载地址位于:点击跳转 使用的固件与驱动版本为:1.0.9.alpha 压缩包名称为:A200-3000-sdk_20.2.0.zip 将A200-3000-sdk_20.2.0.zip解压后可以看到Ascend310-source-minirc.tar.gz压缩包,这个压缩包里有ascend200AI加速
2022-03-25 15:41:13 1791 1
原创 linux内核解析设备树节点
linux内核解析设备树节点准备dtb转化为device_nodestart_kernel->setup_arch->setup_machine_fdtstart_kernel->setup_arch->arm64_memblock_initstart_kernel->setup_arch->unflatten_device_tree准备dtb转化为device_nodestart_kernel->setup_arch->setup_machine_fd
2022-03-13 09:13:03 1063
原创 程序如何在内存中执行?
cpu是如何加载程序运行的?前言裸机:(这里特指一般的普通arm单片机,排除有很多奇奇怪怪的cpu结构的单片机)Linux ELF文件:前言这里只是我自己对cpu如何加载程序运行以及代码重定位的理解,不一定对。Nor-flash的接口和sram的接口一样,都可以对字节进行寻址,而nand-flash只能对块进行寻址,一个块可能有256字节,所以程序要加载到ram或者nor-flash进行运行,因为PC指针指向的是下一条要运行的指令的地址,所以pc指针必须要字节寻找。一些小的单片机,例如cortex
2022-02-24 19:09:44 1684
原创 linux spi驱动分析
昇腾310 spi驱动详解准备设备树节点和驱动的匹配spi控制器驱动详解准备使用的源码包为华为官方的ascend200AI加速模块的SDK,其下载地址位于:点击跳转使用的固件与驱动版本为:1.0.9.alpha压缩包名称为:A200-3000-sdk_20.2.0.zip将A200-3000-sdk_20.2.0.zip解压后可以看到Ascend310-source-minirc.tar.gz压缩包,这个压缩包里有ascend200AI加速模块的linux内核源码包、设备树及驱动文件等。设备树节
2022-02-14 22:00:07 2654 3
原创 飞哥教你如何交叉编译glib
工具:libffi-3.0.13 zlib-1.2.8 glib-2.40.0一.zlib的编译和安装tar xvaf zlib-1.2.8.tar.gzcd zlib-1.2.8./configure --prefix=/usr/local/bluez/bluez CC=arm-linux-gnueabihf-gcc --host=...
2019-11-24 21:42:51 727
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人