自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(184)
  • 资源 (4)
  • 收藏
  • 关注

原创 Python open 默认编码修改

如果在 Windows 平台使用 Python,很多时候 open 函数的默认编码方式是 gbk,如果是自行编码,可以通过 encoding 参数来修改为 utf-8,但当与他们合作开发或引用第三方库时,修改每一个open 的参数成本参数过高。当前有以下几种解决办法:1. 更改默认的编码方式>>> import _locale>>> _locale._getdefaultlocale = (lambda *args: ['en_US', 'utf8'])

2022-05-02 11:15:32 4305 2

原创 17 需求分析是什么?怎么分析?

什么是需求分析? 需求分析就是一个将用户需求变成产品需求的过程。怎么做需求分析? 软件项目的用户需求分析过程不是一成不变的,是迭代进行的,如下所示:收集需求:对用户需求进行进行收集整理 分析需求:对需求进行分析,挖掘用户真实需求 需求评估:筛选过滤掉不可行的需求 需求设计:针对用户需求提出解决方案,设计成产品方案 验证需求:验证方案是否可行分析用户需求的三个层次:表层需求、深层需求、底层需求。...

2021-12-09 21:03:17 1419

原创 怎样才能写好项目文档

怎样才能写好项目文档

2021-12-09 07:45:07 1633

转载 标准C函数库和POSIX函数库的关系

转载地址:标准C函数库和POSIX函数库的关系_smstong的成长轨迹-CSDN博客The C POSIX library is a specification of a C standard library for POSIX systems. It was developed at the same time as the ANSI C standard. Some effort was made to make POSIX compatible with standard C; POSIX in

2021-10-25 13:37:46 818

原创 sdhci.h

struct sdhci_host { /* Data set by hardware interface driver */ const char *hw_name; /* Hardware bus name */ unsigned int quirks; /* Deviations from spec. *//* 在复位前需要设置时钟 *//* Controller doesn't honor resets unless we touch the clock register */#d.

2021-05-25 13:55:26 412

原创 Ubuntu安装vmtools后,Window无法向其复制文件

问题描述Window10安装VMware 15,VMware中安装了Ubuntu 18.04(或者Ubuntu 20.04),在Ubuntu中安装完vmtool后,发现从Windows向Ubuntu中复制文件或内容。解决办法不使用官方提供的vmtool,使用开源的vmtool。sudo apt install open-vm-tools-desktop fuse...

2021-03-28 08:48:55 2070

原创 内存管理之内存映射——概述

内存映射是在进程的虚拟地址空间中创建一个映射,分为以下两种:文件映射:文件支持的内存映射,把文件的一个区间映射到进程的虚拟地址空间,数据源是存储设备上的文件。 匿名映射:没有文件支持的内存映射,把物理内存映射到进程的虚拟地址空间,没有数据源。通常把文件映射的物理页称为文件页,把匿名映射的物理页称为匿名页。根据修改是否对其他进程可见和是否传递到底层文件,内存映射分为共享映射和私有映射:共享映射:修改数据时映射相同区域的其他进程可以看见,如果是文件支持的映射,修改会传递到底层文件。 私有.

2021-02-18 16:45:06 1432

原创 内存管理之物理地址空间

物理地址是处理器在系统总线上看到的地址。使用精简指令集(Reduced Instruction Set Computer,RISC)的处理器通常只实现一个物理地址空间,外围设备和物理内存使用统一的物理地址空间。程序只能通过虚拟地址访问外设寄存器,内核提供了以下函数来把外设寄存器的物理地址映射到虚拟地址空间:函数ioremap()把外设寄存器的物理地址映射到内核虚拟地址空间void *__ioremap(phys_addr_t offset, size_t size, unsigned lo.

2021-02-18 16:01:45 904

原创 内存管理之虚拟地址空间布局——用户虚拟地址空间布局

进程的用户虚拟地址空间的起始地址是0,长度是TASK_SIZE,由每种处理器架构自定义实现。ARM64架构定义的宏如下:32位用户空间程序:TASK_SIZE的值是TASK_SIZE_32,即0x100000000,等于4GB; 64位用户空间程序:TASK_SIZE的值是TASK_SIZE_64,即2的VA_BITS次幂字节(VA_BITS是编译内核时选择的虚拟地址位数)。arch/arm64/include/asm/memory.h#define VA_BITS (CONFIG_ARM6

2021-02-16 18:33:17 276

原创 内存管理之虚拟地址空间布局——虚拟地址空间划分

因为目前应用程序没有那么大的内存需求,所以ARM64处理器不支持完全的64位虚拟地址,实际支持情况如下:虚拟地址的最大宽度是48位:内核虚拟地址在64位地址空间的顶部,高16位是全1,范围是[0xFFFF_0000_0000_0000, 0xFFFF_FFFF_FFFF_FFFF]; 用户虚拟地址在64位地址空间的底部,高16位全是0,范围是[0x0000_0000_0000_0000, 0x0000_FFFF_FFFF_FFFF];高16位是全1或全0的地址称为规范的地址,两者之间是不规范的地

2021-02-16 18:02:42 1290

原创 CAN总线远程帧问题

最近被问到了CAN总线远程帧的问题,在网上搜索了很多资料,发现很多资料比较误导人,开始也误导我了,这里更正一下:1、所谓“远程帧”是一个传统翻译上的误区,Remote Frame实际上它的意义是“遥控帧”,发起方发起特定ID的远程帧(这里的远程帧是一个完整的帧,不仅包含帧ID,还有帧开始、帧结束、CRC等部分),那么与其ID相符的终端设备接收到该帧后,需要立即回复一个数据帧(这里是一个完整的数据帧,不是只有数据)。2、很多芯片厂商为了实现接收方能够快速回复远程帧,会在CAN总线发送、接收功能外,单独

2021-02-01 17:12:32 1299

原创 Ubuntu18.04 Python3报错:ModuleNotFoundError: No module named ‘Cryptodome‘的解决办法

在网上搜索了很多有关该问题的解决方案,基本上大同小异,但是试一个一个不行,个人觉得可能是跟系统的环境有关系,我的系统环境:Ubuntu 18.04 系统环境中既有Python2又有Python3 pip3(系统安装时是没有这个的,后来自己单独安装的:sudo apt-get install python3-pip)解决这个问题时只安装了pycryptodome包就可以了,命令如下:pip3 install -i https://mirrors.aliyun.com/pypi/simple p

2021-01-26 13:39:49 6657 3

原创 pip或pip3下载速度慢的问题

有时候在使用pip或pip3安装包时,下载速度很慢,解决办法如下:采用国内的源加载下载软件包;常用的源:豆瓣:https://pypi.douban.com/simple 阿里:https://mirrors.aliyun.com/pypi/simple安装命令:pip3 install -i https://mirrors.aliyun.com/pypi/simple 模块名...

2021-01-26 13:17:40 1090

原创 Python中pip和pip3的区别

pip和pip3都是python中的包管理工具,他们的区别如下:如果系统中只安装了Python2,那么就只能使用pip。 如果系统中只安装了Python3,那么既可以使用pip也可以使用pip3,二者是等价的。 如果系统中同时安装了Python2和Python3,则pip默认给Python2用,pip3指定给Python3用。...

2021-01-26 13:09:55 4891

原创 printf() 中的 format 格式 %zu

printf()的语法格式为:%[parameter][flags][width][.precision][length]type%zu对照过来,z 属于 length 字段,u 属于 type 字段。该表达式用来表明输出格式是长度型(size_t)的无符号整型值。其中 size_t 在不同的位数操作系统中定义是不同的:/* 32位 */typedef unsigned int size_t;typedef int ssite_t;/* 64..

2021-01-22 10:21:40 14622

原创 Eclipse 设置行长度提示线

设置步骤(文字):Window --> Preferences --> General --> Editors --> Text Editors设置步骤(图):图1图2

2020-12-11 10:04:42 379

原创 第一个STM32MP157裸机程序

折腾了差不多3天时间,我的第一个STM32MP157裸机程序总算点亮了LED。环境:(1)PanGu开发板(2)Window10 + VMware(Linux,我这里使用的是Deepin 20,也可以使用Ubuntu 20)软件:(1)Windows:JDK(64bit)+ STM32CubeProgrammer(v2.5.0)(2)Linux:i2som-image-qt-openstlinux-eglfs-pangu-x86_64-toolchain-2.6-snapshot.s

2020-11-13 18:56:06 1513

原创 proc文件系统简介及/proc目录介绍

1.proc文件系统简介proc文件系统是由内核创建的虚拟文件系统,被内核用来向用户导出信息,通过它可以在Linux内核空间和用户空间之间进行通信。2./proc目录介绍/proc目录下有很多目录、文件,下面对一些常见的进行介绍:/proc/buddyinfo -- 每个内存区中的每个order有多少块可用,和内存碎片问题有关 /proc/cmdline -- 启动时传递给kernel的参数信息 /proc/cpuinfo -- cpu的信息 /proc/crypto...

2020-06-30 21:51:30 1641

原创 Linux内核深度解析之内核互斥技术——读写自旋锁

读写自旋锁读写自旋锁(通常简称读写锁)是对自旋锁的改进,区分读者和写者,允许多个读者同时进入临界区,读者和写者互斥,写者和写者互斥。如果读者占有读锁,写者申请写锁的时候自旋等待。如果写者占有写锁,读者申请读锁的时候自旋等待。读写自旋锁的定义:include/linux/rwlock_types.htypedef struct { arch_rwlock_t raw_lock; ...} rwlock_t;各种处理器架构需要自定义数据类型arch_rwlock_t,ARM6

2020-06-27 09:57:01 890

原创 Linux内核深度解析之内核互斥技术——自旋锁

自旋锁自旋锁用于处理器之间的互斥,适合保护很短的临界区,并且不允许在临界区睡眠。申请自旋锁的时候,如果自旋锁被其他处理器占有,本处理器自旋等待(也称为忙等待)。进程、软中断和硬中断都可以使用自旋锁。目前内核的自旋锁是排队自旋锁(queued spinlock,也称为“FIFOticketspinlock”),算法类似于银行柜台的排队叫号。自旋锁的定义:include/linux/spinlock_types.htypedef struct raw_spinlock { arch..

2020-06-26 10:49:31 395

原创 Linux内核深度解析之内核互斥技术——原子变量

原子变量原子变量用来实现对整数的互斥访问,通常用来实现计数器。内核定义了3种原子变量:(1)整数原子变量,数据类型是atomic_tinclude/linux/types.htypedef struct { int counter;} atomic_t;(2)长整数原子变量,数据类型是atomic_long_t(3)64位整数原子变量,数据类型是atomic64_t初始化静态原子变量的方法(以整数原子变量为例):atomic_t <name> = AT

2020-06-25 20:26:06 1710

原创 Linux内核深度解析之内核互斥技术——实时互斥锁

实时互斥锁实时互斥锁是对互斥锁的改进,实现了优先级集成(priority inheritance),解决了优先级反转(priority inversion)的问题。如果需要使用实时互斥锁,编译内核时需要开启配置宏CONFIG_RT_MUTEXES。实时互斥锁的定义:include/linux/rtmutex.hstruct rt_mutex { raw_spinlock_t wait_lock; struct rb_root_cached waiters; struct ta

2020-06-25 19:05:17 1072

原创 Linux内核深度解析之内核互斥技术——互斥锁

互斥锁互斥锁只允许一个进程进入临界区,适合保护比较长的临界区,因为竞争互斥锁时进程可能睡眠和再次唤醒,代价很高。尽管可以把二值信号量当做互斥锁使用,但是内核单独实现了互斥锁。互斥锁的定义:include/linux/mutex.hstruct mutex { atomic_long_t owner; spinlock_t wait_lock;#ifdef CONFIG_MUTEX_SPIN_ON_OWNER struct optimistic_spin_queue osq;

2020-06-25 18:50:27 873

原创 Linux内核深度解析之内核互斥技术——读写信号量

读写信号量读写信号量是对互斥信号量的改进,允许多个读者同时进入临界区,读者和写者互斥,写者和写者互斥,适合在以读为主的情况下使用。读写信号量的定义:include/linux/rwsem.hstruct rw_semaphore { atomic_long_t count; struct list_head wait_list; raw_spinlock_t wait_lock;#ifdef CONFIG_RWSEM_SPIN_ON_OWNER struct optimistic_

2020-06-25 15:06:35 565

原创 Linux内核深度解析之内核互斥技术——信号量

信号量信号量允许多个进程同时进入临界区,大多数情况下只允许一个进程进入临界区,把信号量的计数值设置为1,即二值信号量,这种信号量称为互斥信号量。和自旋锁相比,信号量适合保护比较长的临界区,因为竞争信号量时进程可能睡眠和再次唤醒,代价很高。内核使用的信号量定义:include/linux/semaphore.hstruct semaphore { raw_spinlock_t lock; /* 自旋锁,用来保护信号量的其他成员 */ unsigned int count; /*

2020-06-25 11:38:56 328

原创 Linux内核深度解析之内核互斥技术

内核互斥技术在内核中,可能出现多个进程(通过系统调用进入内核模式)访问同一个对象、进程和软中断访问同一个对象、进程和硬中断访问同一个对象、多个处理器访问同一个对象等现象,我们需要使用互斥技术,确保在给定的时刻只有一个主体可以进入临界区访问对象。如果临界区的执行时间比较长或者可能睡眠,可以使用下面这些互斥技术:(1)信号量,大多数情况下我们使用互斥信号量(2)读写信号量(3)互斥锁(4)实时互斥锁申请这些锁的时候,如果锁被其他进程占有,进程将会睡眠等待,代价很高。如果临界区的执

2020-06-25 11:18:50 550

原创 Linux内核深度解析之中断、异常和系统调用——中断

中断中断是外围设备通知处理器的一种机制。1. 中断控制器外围设备不是把中断请求直接发送给处理器,而是发给中断控制器,由中断控制器转发给处理器。不同种类的中断控制器的访问方法存在差异,为了屏蔽差异,内核定义了中断控制器描述符irq_chip,每种中断控制器自定义各种操作函数。GICv2控制器的描述符如下:drivers/irqchip/irq-gic.ctatic const struct irq_chip gic_chip = { .irq_mask = gic_mask_i.

2020-06-25 09:58:52 1591

原创 Linux内核深度解析之中断、异常和系统调用——中断下半部之小任务

小任务小任务(tasklet,有的书中翻译为“任务蕾”)是基于软中断实现的。为什么要提供小任务?因为小任务相对软中断有以下优势:(1)软中断的种类是编译时静态定义的,在运行时不能添加或删除;小任务可以在运行时添加或删除(2)同一种软中断的处理函数可以在多个处理器上同时执行,处理函数必须是可以重入的,需要使用锁保护临界区;一个小任务同一时刻只能在一个处理器上执行,不要求处理函数是可以重入的。小任务根据优先级分为两种:低优先级小任务和高优先级小任务。1. 数据结构小任务的数据结构如下:

2020-06-25 09:54:23 231

原创 Linux内核深度解析之中断、异常和系统调用——中断下半部之软中断

软中断软中断(softirq)是中断处理程序在开启中断的情况下执行的部分,可以被硬中断抢占。内核定义了一张软中断向量表,每种软中断有一个唯一的编号,对应一个softirq_action实例,softirq_action实例的成员action是处理函数。kernel/softirq.cstatic struct softirq_action softirq_vec[NR_SOFTIRQS] __cacheline_aligned_in_smp; /* 软中断向量表 */include/l

2020-06-25 09:53:01 903 1

原创 Linux内核深度解析之中断、异常和系统调用——中断下半部

中断下半部Linux中断下半部有3种:软中断(softirq)、小任务(tasklet)和工作队列(workqueue)。3种下半部的区别:(1)软中断和小任务不允许睡眠;工作队列是使用内核线程实现的,处理函数可以睡眠(2)软中断的种类是编译时静态定义的,在运行时不能添加或删除;小任务可以在运行时添加或删除(3)同一种软中断的处理函数可以在多个处理器上同时执行,处理函数必须是可以重入的,需要使用锁保护临界区;一个小任务同一时刻只能在一个处理器上执行,不要求处理函数是可以重入的...

2020-06-25 09:48:12 193

原创 Linux下操作超过2GB大文件

参考:gcc -D_FILE_OFFSET_BITS=64参考:What is the difference between _LARGEFILE_SOURCE and _FILE_OFFSET_BITS=64?What is the difference between _LARGEFILE_SOURCE and _FILE_OFFSET_BITS=64?在头文件之前添加:#define _FILE_OFFSET_BITS 64或者更改编译选项:gcc -D_FILE_OFFSET

2020-06-23 21:06:07 624

原创 Linux内核深度解析之中断、异常和系统调用——系统调用

系统调用系统调用是内核给用户程序提供的编程接口。用户程序调用系统调用,通常使用glibc库针对单个系统调用封装的函数。如果glibc库没有针对某个系统调用封装的函数,用户程序可以使用通用的封装函数syscall():#define _GNC_SOURCE#include <unistd.h>#include <sys/syscall.h> /* 定义SYS_xxx */long syscall(long number, ...);参数number是

2020-06-21 22:17:53 2220 2

原创 Linux内核深度解析之中断、异常和系统调用——中断下半部之工作队列

工作队列工作队列(work queue)是使用内核线程异步执行函数的通用机制。工作队列是中断处理程序的一种下半部机制,中断处理程序可以把耗时比较长并且可能睡眠的函数交给工作队列。工作队列不完全是中断处理程序的下半部,同时内核的其他模块也可以将异步执行的函数交给它执行。1.编程接口内核使用工作项保存需要异步执行的函数,工作项的数据接口是work_struct,其定义如下:include/linux/workqueue.hstruct work_struct { atomic_l.

2020-06-21 17:06:43 1399

原创 Linux内核深度解析之中断、异常和系统调用——ARM64异常处理

4.1 ARM64异常处理4.1.1异常级别ARM64处理器定义了4个异常级别:0~3。通常ARM64处理器在异常级别0执行进程,在异常级别1执行内核。ARM64处理器的异常级别0就是我们常说的用户模式,异常级别1就是我们常说的内核模式。4.1.2异常分类在ARM64体系结构中,异常分为同步异常和异步异常。同步异常:(1)系统调用(2)数据中止(3)指令中止(4)栈指针或指令地址没有对齐(5)没有定义的指令(6)调试异常异步异常:(1)中断(IRQ)..

2020-06-14 22:05:17 1650

原创 【u-boot-2018.11】tool之mkimage

mkimage是u-boot下的一个工具,该工具是用来制作不压缩或压缩的多种可启动映像文件。一般情况下,使用mkimage制作映像文件的时候,是在原来的可执行映像文件的前面加上一个0x40字节的头,记录参数所指定的信息,这样u-boot才能识别这个映像是针对哪个CPU体系架构的,哪个OS的,哪种类型,加载到内存中的哪个位置,入口地址在内存中的哪个位置及映像文件名是什么。它的使用方式如下:...

2019-10-28 22:21:27 823

原创 【u-boot-2018.11】编译工具链常用命令

编译工具链常用命令:命令1:arm-linux-gcc用于编译过程,常用的选项包括:-g:产生调试信息,用于GDB调试 -c:编译源文件,但是不链接命令2:arm-linux-ld用于链接过程,常用的选项包括:-Ttext:指定链接地址命令3:arm-linux-objcopy用于格式转换,可以将elf文件转换为bin文件,常用选项包括:-O:指定以什么格式输出,...

2019-10-28 21:50:35 322

原创 【u-boot-2018.11】源码分析之board_init_f

1.board_init_f:(common/board_f.c)// 该函数在crt0.S中被调用,boot_flags=0void board_init_f(ulong boot_flags){ // 标志为0 gd->flags = boot_flags; // 终端标志为0 gd->have_console = 0; // 执行初始化链表...

2019-10-05 14:38:40 569

原创 【u-boot-2018.11】源码分析之gd_t(struct golobal_data)

一、global_data功能global_data又称为GD,顾名思义,global_data就是用来存储u-boot的全局数据的。二、global_data结构体介绍typedef struct global_data { bd_t *bd; /* bd_info结构体定义,位于include/asm-generic/u-boot.h中,用于保存开发板相关参数 */ u...

2019-10-04 22:45:05 753

原创 【u-boot-2018.11】源码分析之lowlevel_init.S

arch/arm/cpu/armv7/lowlevel_init.S:#include <asm-offsets.h>#include <config.h>#include <linux/linkage.h>.pushsection .text.s_init, "ax"WEAK(s_init) bx lrENDPROC(s_init).po...

2019-10-02 19:35:08 478

原创 【u-boot-2018.11】源码分析之start.S

arch/arm/cpu/armv7/start.S:#include <asm-offsets.h>#include <config.h>#include <asm/system.h>#include <linux/linkage.h>#include <asm/armv7.h>/*******************...

2019-10-02 19:23:20 486

uboot顶层config.mk分析

config.mk主要做的工作: 1.设置obj和src,并清空各种标志(26 ~ 45行) 2.与ppc相关的交叉编译工具的配置(54 ~ 70行,不重要,可以不看) 3.shell相关的一些配置、主机编译器相关的一些配置(74 ~ 84行) 4.配置交叉编译工具链(91 ~ 107行) 5.加载开发板相关的配置选项(111 ~ 130行) 6.编译选项相关的配置(135 ~ 141行,不重要,可以不看) 7.指定链接脚本(142 ~ 149行) 8.获取链接地址(154 ~ 158行) 9.设置头文件搜索路径(160 ~ 166行) 10.使用起始链接地址(198 ~ 201行) 11.BFD库相关的配置(213 ~ 228行,不重要,可以不看) 12.设置自动推导规则(239 ~ 256行)

2018-09-04

uboot顶层Makefile分析

uboot顶层Makefile分析,一行指令对应一行注释,看起来很方便

2018-08-31

SQLiteStudio

查看SQLite数据库的工具

2017-07-27

M72-D硬件手册及AT指令集

M72-D硬件手册及AT指令集

2016-04-26

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除