自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

原创 [debian12] wps for linux打开PDF卡死

wps使用wpspdf处理PDF文件,而wpspdf依赖于。而系统更新后,linux发行版提供的是或更新版本,导致其无法正常工作。

2024-05-06 08:59:37 471

原创 基于设备树的中断控制器的初始化

在中断控制器驱动中,通常会使用宏来注册中断控制器的初始化函数,以ARM的GICcompatiblecompatible。

2024-04-14 13:16:58 128

原创 [linux api] of_irq_init

这是典型的基于队列实现层序遍历的做法,不再赘述。中找出以其为父控制器的中断控制器,对其进行初始化后,从。会确保先初始化父控制器再初始化子控制器,也即整体按照。进行匹配,找出所有的中断控制器节点,串到一条名为。字段,用来匹配中断控制器设备节点的。遍历所有设备节点,并与参数。)作为当前的父控制器,从。取出,并添加到另一条链表。的首元素,作为新一轮的。

2024-04-14 10:32:52 75

原创 vscode跳转到定义的性能问题

设置完成后,你会发现,

2024-04-12 12:17:09 723 1

原创 C运行时错误——error realloc(): invalid next size

不妨设这段预留的内存大小为16字节,若我们获得的系统分配的内存块的起始地址为0x80300000, 设定的长度是0x200。除了分配给我们在参数中设定大小的内存(可能会有内存对齐,实际分配的比参数设定的要多),还会在这块所分配的内存之前预留出一块内存,记录所分配内存的位置、大小等。这样一来,在释放这块内存时就会出现问题,导致程序运行时崩溃。我们在malloc或calloc等API分配内存时,程序中出现的问题是无意中访问并改写了预留的16字节的。

2023-08-19 16:06:33 508

原创 esp-idf的电源管理——sleep功能

RTC硬件并无deep sleep/light sleep之分。这两个sleep分类只是软件上的,软件通过下电的电源域不同来区分,但实际上,两者的本质区别在于现场是否可恢复。light sleep是现场可恢复的sleep,因此从哪里睡下去就会在哪里醒来继续运行。deep sleep是现场不可恢复的sleep,包括内存在内的大多数电路都会掉电,因此醒来只能从头开始跑。简单的看一下deep sleep的接口......*//* 软件意义上开始deep sleep的点 */

2023-08-19 15:32:51 332

原创 esp-idf的电源管理——电源管理组件

先概括的介绍一下IDF电源管理组件中的电源锁与动态频率切换。对主机CPU有了解的都知道,像Intel的酷睿处理器有个功能,CPU非常聪明,可以在繁忙(需要高性能)的时候抬高频率,在不忙的时候降低频率,这样在保证用户体验的同时还节省了能耗、降低了对散热系统的要求。Intel的CPU的睿频功能主要是硬件完成的,esp系列芯片当然没有这么强大的功能,不过IDF通过软件实现了类似的功能(当然和睿频比是比较粗浅的)。实现动态频率切换的关键在于。到底什么是电源锁呢?不妨举个具体的例子来说明。

2023-08-19 15:29:31 265

原创 esp-idf的电源管理——freeRTOS的idle task

idle task,顾名思义,就是在系统空闲,也即没有任何任务就绪的情况下执行的任务。为什么需要idle task呢,就我的理解来看,RTOS(不仅限于freeRTOS)跑起来之后,某个固定的时刻要么在中断上下文,要么在任务上下文(这里不考虑更复杂支持特权分离的操作系统)。如果没有idle task,那么在所有task都处于非就绪态时,RTOS的调度器将陷入没有task可调度的困境。idf在启动阶段会进行一系列的初始化,并最终启动freeRTOS。这里我们主要关注的是idle task。

2023-08-19 15:28:19 309

原创 esp-idf的电源管理——软件的总体结构

esp sleep又可以进一步细分为两层,分别是软件sleep flow以及最终落实到硬件寄存器的rtc sleep。这套电源管理在软件层面怎么使用呢?更具体的内容将在后续章节介绍。

2023-08-19 15:26:39 151

原创 esp-idf的电源管理——esp系列芯片的功耗管理硬件

当我们为芯片设计外围电路时,必然会设计供电电路,这是芯片能正常工作的前提。通常是电源电压通过一个稳压电路之后给到芯片的供电引脚。以S3为例,下面是S3的引脚图:其中以VDD打头的就是供电引脚。比如VDD3P3VDDA等。供电引脚不止一个,这些供电引脚有什么区别呢?不难猜到,不同的供电引脚为芯片内部不同的硬件模块供电,比如VDDA是给芯片中的模拟电路供电的,而VDD3P3则是给数字电路供电的。我不是十分肯定这样设计的原因,猜测这种区分是为了供电的稳定。

2023-08-19 15:23:23 162

原创 esp-idf的电源管理——启航

【代码】【无标题】

2023-08-17 15:54:36 120

原创 esp-idf的内存管理——内存管理组件的初始化

目录1 堆的初始化概览2 堆的初始化源码分析2.3.2.2 堆的初始化3 归还启动栈参考1 堆的初始化概览2 堆的初始化源码分析2.3.2.2 堆的初始化do_core_init会调用heap_caps_init初始化堆。简单浏览一遍这个函数:void heap_caps_init(void){ /* 获取所有可以作为堆的memory regions */ size_t num_regions = soc_get_available_memory_region_max_count

2022-05-19 13:11:17 1350

原创 esp-idf的内存管理——内存调试

目录1 堆调试功能的使能1.1 通过Kconfig使能1.2 使能之后源码层面的变化2 堆调试功能——POISONING3 堆调试功能——TRACE4 堆调试功能的使用经验参考1 堆调试功能的使能1.1 通过Kconfig使能idf提供了两种堆调试机制,POISONING以及TRACE。默认情况下,堆调试是未使能的。可以在menuconfig中配置使能,位置在:Component configHeap memory debuggingPOISONING默认是no poisoning,但

2022-05-19 13:10:26 1841

原创 esp-idf的内存管理——tlsf之上的封装

目录1 为什么要封装2 先看结构2.1 multi heapnote1note22.2 heap caps2.3 层次关系3 再看接口3.1 内存的申请3.2 内存的释放3.2 堆完整性检测3.3 其它参考1 为什么要封装封装通常会降低效率,但能够带来诸如通用性提升等好处,idf在tlsf的基础上增加封装,其作用可以概括为以下两点:上下层接口分离,上层接口和底层实际使用的内存管理算法无关,这样,以后有更优秀的算法,也可以很方便移植单纯的tlsf没办法满足idf的需要,比如不支持内存的caps,没有

2022-05-17 21:56:28 2107

原创 esp-idf的内存管理——tlsf算法

目录1 最初还不是tlsf2 为什么要引入tlsf3 idf中使用的tlsf算法的设计与实现4 源码走读参考1 最初还不是tlsf2 为什么要引入tlsf3 idf中使用的tlsf算法的设计与实现4 源码走读参考[1] 半文钱的博客[2] upstream所在的github地址注意事项放到内存调试去说:用户需要关注的:内存的硬件特性(caps)内存的访问速度内存是否支持原子操作内存是否可以由CPU直接访问用户在使用时:用户自己也要对自己的应用需要使用的内存做一些安排,有的内存比

2022-05-16 17:53:51 3819 1

原创 esp-idf的内存管理——esp系列芯片的内存

目录1 内存的分类2 内存的特性3 软件对内存的描述4 参考1 内存的分类2 内存的特性3 软件对内存的描述4 参考[1] esp系列芯片的TRM[2] esp-idf源码

2022-05-06 12:17:58 2332

原创 esp-idf的内存管理——启航

1 目标相关博客的目标:理清楚idf的内存管理组件——设计与实现使自己能够熟练使用idf的内存管理机制为对此感兴趣的后来人提供一个高效的引导2 规划所有内容分为5部分:esp-idf的内存管理——esp系列芯片的内存:内存管理是用来管理内存的,当然有必要了解esp系列芯片使用的内存都有怎样的特性,这是进一步介绍如何管理内存的前提。esp-idf的内存管理——tlsf算法:idf最初使用内存管理算法并非tlsf,因此有必要关注一下为什么转向tlsf,以及tlsf本身的设计与实现。esp

2022-05-04 22:16:21 1387

原创 关于冯诺依曼架构和哈佛架构的一点思考

目录1 冯诺依曼架构2 哈佛架构2.1 从软件的角度看哈佛架构2.2 从硬件的角度看哈佛架构3 混合架构(改进的哈佛架构)3.1 MCU使用的混合架构3.2 MPU使用的混合架构3.3 总结1 冯诺依曼架构冯诺依曼架构讲计算机分为五个部分:运算器控制器存储器输入设备输出设备从wiki找了一张图说明上述5个部分的关系:冯诺依曼架构有个特点:程序和数据放在一起,位于存储器。这也就意味着,只需要一条数据总线和地址总线,就可以实现指令的读取和数据的读写。这样做硬件上当然更加简单,成本也低。但

2022-04-04 13:16:35 5997 2

原创 Makefile中的$$

1 $$的用处在uboot/kernel的顶层Makefile中我们可以看到,当执行make时同时传入多个目标是这样处理的:__build_one_by_one: $(Q)set -e; \ for i in $(MAKECMDGOALS); do \ $(MAKE) -f $(srctree)/Makefile $$i; \ done其中的$$i比较奇怪,Makefile引用变量只需要一个$符号就够了,为什么这里要两个呢?因为变量i是在shell的for循环中定义的,是属于shell中的

2022-03-13 15:14:29 7066

原创 Makefile目标的专属变量

1 需求有时我们会希望在编译整个项目时,对其中某个或某几个源文件附加一些编译选项,且不能改动源文件。这个时候,在Makefile中需要怎么做呢?答案就是目标的专属变量。2 用法举例如下:CFLAGS := test.PHONY: all.PHONY: t1.PHONY: t2all: t1 t2t1: CFLAGS += test1t1: @echo $(CFLAGS )t2: CFLAGS += test2t2: @echo $(CFLAGS

2022-03-06 22:56:49 1118

原创 make的选项总结

目录1 -f与-C2 -e2.1 令行传参2.2 Makefile和shell的export3 -j4 -I5 -B1 -f与-C选项含义-f读取指定的文件并执行(给出所指定的文件的pathname即可)-C到指定目录下读取Makefile文件并执行(给出指定的目录的路径)-f对文件名没有要求,但文件内容必须符合make的语法;-C则是在进入指定的目录读取Makefile文件之前,先执行切换目录的操作,且文件名必须是makefile、Makefile等。由于-C选项

2022-03-06 12:14:33 2918

原创 也谈C语言的字符串字面量

1 什么是字符串字面量在C语言中,形如"hello world"的字符串即为字符串字面量(常量)。与之对比的是字符串变量,也即字符数组,形如char arr[] = "hello world"。两者在用法上有很多相似之处,但两者的存储属性是截然不同的。2 编译器眼中的字符串字面量我们经常会看到这种字符串字面量的用法:const char *p = "hello world";但千万不要以为在编译器眼里字符串字面量是const char *,之所以要强调这一点,是因为这会影响我们对sizeof("

2022-02-23 09:40:25 4485

原创 Ubuntu使用有线网卡连接开发板,同时使用无线网卡上网

1 工作需求使用有线网卡连接开发板是一个很常见的场景,但真正这么使用时会发现,可以和开发板通信了,但没法上网查资料了,尽管此时无线网卡连上了WIFI。从现象上看,应该是上网的包优先从有线网卡出去。2 解决办法如果使用的是虚拟机,那么可以用物理机上网查资料;如果是Ubuntu主机,那么可以找一个能够上网的路由器,比如无线网卡正连接的那个,然后将开发板连通过网线接到路由器,主机无论是使用有线还是无线网卡,连上路由器后,既可以和开发板通信,也可以上网;如果因为一些原因,比如公司的路由器放在了固定的位置

2022-02-16 23:15:58 2943

原创 Ubuntu终端环境打造

1 安装terminator以前一直使用Ubuntu自带的终端,直到看到同事都在使用terminator,觉得比较好用,于是也安装一个。terminator是一个第三方的终端,在分屏(一屏多终端)方面非常方便,可以提高工作效率。安装过程很简单,执行:# apt install terminator如果当前系统的python环境已经修改为pyhton3,那么点击terminator可能无法运行,因为terminator是基于python2的。解决方案:修改文件/usr/bin/terminator

2022-02-13 23:19:39 1741

原创 esp-idf的中断和异常管理——中断和异常的处理流程

目录1 中断/异常向量表1.1 xtensa1.2 riscv2 中断/异常的处理流程2.1 xtensa2.1.1 中断2.1.2 异常2.2 riscv2.2.1 中断2.2.2 异常3 注册中断/异常的handler3.1 xtensa3.1.1 异常3.1.2 中断3.2 riscv4 IDF的中断管理机制1 中断/异常向量表1.1 xtensa对于xtensa,中断/异常向量表借助链接脚本来实现。具体的说,中断/异常的入口(含最初的处理程序,不仅仅是一个地址)被等间隔的链接,以s3的链接脚本

2021-12-06 00:12:47 3228

原创 ​ C语言的类型转换

​C语言无符号数转换:​​#include <stdio.h>#define rol(var, shift) ({ unsigned long long _var = var; (typeof(var))(((

2021-11-21 00:25:54 1232

原创 GCC的内联汇编

想对着GCC手册总结以下内联汇编,但在网上看到一篇博客已经总结的很好了,就不再做重复的事情。给同样需要学习内联汇编的同学推荐这篇博客。顺带吐槽一下,GCC手册写的实在晦涩…

2021-11-04 23:55:31 796

原创 C语言的函数参数与栈

static int *pa0;static int *pa1;static int b0;static int b1;void test_func(int a0, int a1) { a0++; a1++; pa0 = &a0; pa1 = &a1;}42004f7c <test_func>:static int *pa0;static int *pa1;static int b0;st

2021-10-25 23:22:44 1716 1

原创 C语言的#、##以及宏定义的嵌套

以前在看u-boot源码的时候,看到一些宏定义非常奇怪,类似下面这样:#define __A_MACRO xxx#define _A_MACRO xxx#define A_MACRO xxx总之就像俄罗斯套娃那样,一个宏套着一个宏,当时不明白为什么要写成这么恶心的样子,也没有去细究。现在明白了,因此记录一下。C语言中的#和##有必要先提一下这两个token,它们在宏定义中使用,作用于宏参数:#:其作用为字符串化,将宏参数转换为一个字符数组(字符串字面量)##:其作用为粘贴两个宏参数

2021-10-24 23:56:38 3675 3

原创 esp-idf的中断和异常管理——esp32 series的中断控制器

目录1 esp32 series的中断控制器2 基于riscv和xtensa的芯片中断模块的区别3 使用esp32 series的中断3.1 中断的配置3.2 中断的处理3.2 中断的清除1 esp32 series的中断控制器和一些中断控制器固定了中断连线不同,esp32 series采用中断矩阵来连接中断源和中断输入引脚。这样做的好处是可以灵活配置中断源对应的中断号。至于中断控制器的内部实现,难以探究,且对于软件来说,也无需知道,通常我们关心的也就是中断控制器在逻辑上的等效,如下图所示:需要说明

2021-10-12 00:50:17 3064 4

原创 esp-idf的中断和异常管理——启航

1 目标写关于esp-idf的中断和异常管理的博客有两个目标:使自己能够熟练使用idf的中断和异常管理机制并了解其背后的实现帮助后来人节省时间,为esp-idf的推广做点微不足道的事情2 规划所有内容分为4部分:esp-idf的中断和异常管理——esp32 series的中断控制器,机制是用来管理硬件的,因此理解机制之前应该先理解硬件,本篇用于讲解esp32系列芯片的中断控制器。esp-idf的中断和异常管理——中断和异常的处理流程,本篇关注从中断或异常产生时会跳转到哪里,怎么一步步执行

2021-10-10 17:19:43 3627

原创 嵌入式软件的调试工具

目录前言1 调试接口2 调试器(适配器)3 OpenOCD与GDB总结前言当我们学习嵌入式软件的调试时,经常会听到一些名词,比如JTAG、SWD、SWIM、ST-Link、JLink、DAP-Link、OpenOCD、GDB。那么这些名词所代表的事物之间到底有什么联系又有哪些差别呢?本文对此做一个简单的梳理和总结,以便后来者可以节省一些没必要花的时间。1 调试接口使用GDB调试时,我们可以灵活的控制芯片的行为,比如断点、单步执行、读写内存、烧写Flash等。这些当然不只是软件层面的事情,这一切的实现

2021-09-22 00:28:45 2119

原创 GCC内链汇编——特定于riscv的constraints

constraints含义f浮点寄存器I12bit有符号立即数J整数0KA 5-bit unsigned immediate for CSR access instructions.A一个存放在通用寄存器中的地址SA constraint that matches an absolute symbolic address.更多特定于体系结构的constraints可见17.8.5 Constraints for Particular Mac...

2021-09-18 20:27:44 216

原创 GCC的-Wl,--wrap编译选项

GCC的--wrap是一个链接器选项,假如我们要编译的源文件为main.c,编译命令如下:gcc main.c -Wl,--wrap=func -o main.elf有以下效果:如果符号func没有(在当前源文件)定义,就链接到__wrap_func如果符号__real_func没有(在当前源文件)定义,就链接到func举例如下:/* a.c */#include <stdio.h>extern int foo();extern int __real_foo();in

2021-08-23 23:29:47 3746 3

原创 pip:ProxyError(‘Cannot connect to proxy.

目录1 问题2 初步尝试2.1 设置环境变量2.2 修改注册表(这是一个夺笋的解决方案呀)2.3 pip的代理设置3 找问题的根源3.1 问题的根源3.2 解决办法3.2.1 从代理入手3.2.2 从源入手3.2.3 从pip入手4 写在最后参考文献1 问题在打开科学上网软件(后面简称XX)的前提下,pip安装python库失败(此时源为阿里源,XX设置为DIRECT,也就是直连,访问国内网站的),pip报错:Looking in indexes: https://mirrors.aliyun.com

2021-07-25 19:32:19 34283 28

原创 GNU链接器的LMA和VMA

LMA:加载存储地址,指的是加载到存储器的地址,即加载到哪里VMA:虚拟存储地址,也就是链接地址,指示代码和数据运行的时候应该位于何处对于主机程序通常LMA是等于VMA的,比如编译PC上写的程序,链接到哪个地址就直接在加载时申请相应的虚拟地址,在实际访问时申请物理地址并和之前申请的虚拟地址建立映射关系。但在嵌入式系统中,两者通常不等,比如芯片启动时的启动程序一般存放在ROM/支持XIP的flash中(RAM易失,存不住),启动程序中的数据(.data、.bss等)一开始也是加载到ROM中的,但RO.

2021-07-23 09:01:52 549

原创 傻瓜式制作纯净版win10启动盘

前言网上不乏许多启动盘制作工具,比如大白菜、老毛桃等,但使用这些工具制作的启动盘在安装系统后通常会预装一些软件,虽然可以卸载,但强迫症患者终究还是不能忍。下面就介绍一种纯净版win10(来自官方)启动盘的制作方式。制作启动盘1 官网下载制作工具进入到官网下载win10镜像的页面,不难发现,windows已经不再直接提供iso镜像下载了,取而代之的是启动盘制作工具的下载:点击立即下载工具后可以下载到MediaCreationTool21H1.exe工具(下载时间不同,版本会有所不同)。2 制作过

2021-05-27 22:45:37 1632

原创 GCC的头文件和库文件的搜索路径

见linux的环境变量总结的1.2节~1.4节。

2020-11-09 21:32:24 242

原创 linux的环境变量总结

目录前言1 路径相关的环境变量1.1 PATH1.2 *_INCLUDE_PATH1.3 LIBRARY_PATH1.4 LD_LIBRARY_PATH参考文献前言本文用于总结linux中常用的环境变量,用于备忘。文中内容来源于网络,所有参考文章均会在文末列出,内容会不断更新。1 路径相关的环境变量1.1 PATH记录可执行文件的路径,比如我们通过shell执行命令时,shell就会在PATH记录的一系列路径下寻找命令对应的可执行文件。1.2 *_INCLUDE_PATH这类环境变量通常会被G

2020-11-09 16:23:52 428

原创 移植linux-5.4.26到jz2440

目录1 内核移植概述2 移植过程2.1 选择编译工具2.231 内核移植概述2 移植过程2.1 选择编译工具cc1: error: unrecognized command line option "-Wno-unused-but-set-variable"make[2]: *** [scripts/mod/empty.o] Error 1make[1]: *** [prepare0] Error 2make: *** [sub-make] Error 22.23...

2020-10-22 21:18:34 1608 2

移植u-boot-2019.10以支持jz2440的补丁文件

移植u-boot-2019.10以支持jz2440的补丁文件!

2020-10-22

2020中兴捧月算法大赛迪杰斯特拉赛道初赛题解源码

2020中兴捧月算法大赛迪杰斯特拉赛道初赛题解源码,50个字的限制真的好傻啊

2020-06-27

workstation-pro-12-user-guide.pdf

*******************************VMware的使用手册*******************************

2019-10-13

遗传算法(C语言实现)

用C语言实现的遗传算法,调试通过,可运行,注释良好。

2019-04-02

空空如也

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

TA关注的人

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