<?xml version="1.0" encoding="utf-8" ?><rss version="2.0"><channel><title><![CDATA[ZHUhapi的博客]]></title><description><![CDATA[]]></description><link>https://blog.youkuaiyun.com/ZHUhapi</link><language>zh-cn</language><generator>https://blog.youkuaiyun.com/</generator><copyright><![CDATA[Copyright &copy; ZHUhapi]]></copyright><item><title><![CDATA[数据库系统概论-基础理论]]></title><link>https://blog.youkuaiyun.com/ZHUhapi/article/details/147768148</link><guid>https://blog.youkuaiyun.com/ZHUhapi/article/details/147768148</guid><author>ZHUhapi</author><pubDate>Wed, 07 May 2025 16:03:32 +0800</pubDate><description><![CDATA[（2）文件系统阶段：由文件系统管理数据，数据存放在硬件中，长期保存，但一个文件只对应一个应用程序，数据冗余度大，共享性差，文件数据结构变化时，应用程序中对文件的定义和数据的使用也要修改。39、活锁：T1封锁数据R，期间T2请求封锁R，T3又请求封锁R，然而系统首先批准了T3的请求，此时T4又请求封锁R，T3解除后又批准了T4的请求，以此类推，T2可能永远等待。（1）应用层（2）语言处理层，如SQL（3）数据存取层（4）数据存储层（5）操作系统，保证数据库管理系统对数据的读写真实映射到物理文件上。]]></description><category></category></item><item><title><![CDATA[奔跑吧Linux内核（入门篇）- 心得笔记总结]]></title><link>https://blog.youkuaiyun.com/ZHUhapi/article/details/144328961</link><guid>https://blog.youkuaiyun.com/ZHUhapi/article/details/144328961</guid><author>ZHUhapi</author><pubDate>Sun, 08 Dec 2024 18:16:20 +0800</pubDate><description><![CDATA[在第二个内核（捕获内核）中，可以对第一个内核产生的崩溃数据继续分析（一般只有简单的初步分析，具体的分析要使用专门的工具，且在正常运行的系统中）。（2）写时复制技术：即父进程创建子进程时不需要复制进程地址空间的内容，只需要复制父进程的进程地址空间的页表给子进程，父子进程就可以共享相同的物理内存。：用于调试内核的文件系统。22、brk()用于调整进程的堆大小，malloc和calloc()调用来扩展堆空间大小，新的堆末尾地址比原先的大，free()则是缩小堆空间，新的堆末尾地址小于当前的堆末尾地址。]]></description><category></category></item><item><title><![CDATA[Linux中断、软中断、MMU内存映射-深入理解]]></title><link>https://blog.youkuaiyun.com/ZHUhapi/article/details/143493661</link><guid>https://blog.youkuaiyun.com/ZHUhapi/article/details/143493661</guid><author>ZHUhapi</author><pubDate>Mon, 04 Nov 2024 20:47:58 +0800</pubDate><description><![CDATA[对软件中断（软件定时器的使用示例）用于按键消抖，每次按键中断发生时都会刷新定时器的到达时间，只有定时时间到后，即软中断触发后，内核会去调用回调函数读取按键值。（硬件中断和软件中断是多对一的关系）软件中断通常有timer、tasklet等，会有一个softirq[]数组，其中某一个成员是tasklet，会从数组内取出action函数执行，软件中断tasklet对应的函数是tasklet_action，该函数会从某一个队列里取出里面的每一个tasklet结构体执行里面的函数func。按键中断中修改定时器时间。]]></description><category></category></item><item><title><![CDATA[Linux中断-实操、概念]]></title><link>https://blog.youkuaiyun.com/ZHUhapi/article/details/142300672</link><guid>https://blog.youkuaiyun.com/ZHUhapi/article/details/142300672</guid><author>ZHUhapi</author><pubDate>Mon, 16 Sep 2024 11:46:48 +0800</pubDate><description><![CDATA[查表可知GPIO5一共用了两个中断号，一个是74、一个是75，分别对应GPIO5_IO00~GPIO5_IO15和GPIO5_IO16~GPIO5_IO31。Linux内核中想使用一个中断是需要申请的，request_irq函数用于申请中断，request_irq可能会导致睡眠，不能在中断上下文中申请。每个worker都有一个工作队列，工作者线程处理自己工作队列中的所有工作（每个CPU都有个工作者线程，并行处理多个工作）。，有专门的线程中断函数，thread_fn中放入线程里要执行的函数。]]></description><category></category></item><item><title><![CDATA[【操作系统】基础知识总结、深入理解]]></title><link>https://blog.youkuaiyun.com/ZHUhapi/article/details/142179981</link><guid>https://blog.youkuaiyun.com/ZHUhapi/article/details/142179981</guid><author>ZHUhapi</author><pubDate>Thu, 12 Sep 2024 16:36:48 +0800</pubDate><description><![CDATA[6、在Linux内核中，进程和线程都是用task_struct结构体表示的，线程的task_struct中部分资源是共享的进程中已创建的资源，例如内存地址空间、代码段、文件描述符等。（2）如果没有空闲的物理内存，那么内核就会开始进行回收内存 (opens new window)的工作，如果回收内存工作结束后，空闲的物理内存仍然无法满足此次物理内存的申请，那么内核就会触发 OOM （Out of Memory）机制(最后的大招)。(2)提高访问的性能，若后面用到这个变量，每次访问数据都要从内存中读取。]]></description><category></category></item><item><title><![CDATA[Linux系统调用过程详解：应用程序调用驱动过程]]></title><link>https://blog.youkuaiyun.com/ZHUhapi/article/details/138683130</link><guid>https://blog.youkuaiyun.com/ZHUhapi/article/details/138683130</guid><author>ZHUhapi</author><pubDate>Fri, 10 May 2024 21:49:53 +0800</pubDate><description><![CDATA[文件描述符本质上是一个非负整数，当一个程序打开一个文件（包括设备文件）时，操作系统返回的文件描述符作为未来所有对该文件的操作的引用。，找到设备文件对应的struct inode结构体描述的信息，得知要操作的设备类型（字符设备还是块设备），还会分配一个struct file结构体。功能：文件描述符提供了一个通用的方法来引用所有类型的文件，无论它们是普通的磁盘文件、目录、链接还是设备（如键盘、硬盘、网络设备等）。a、每个设备文件都有一个对应的’inode‘结构体，包含了设备的主次设备号，是设备的唯一标识。]]></description><category></category></item><item><title><![CDATA[Linux字符设备驱动-详解与实操：驱动架构、设备树、Pinctrl子系统和GPIO子系统、platform、设备树下的platform]]></title><link>https://blog.youkuaiyun.com/ZHUhapi/article/details/138327961</link><guid>https://blog.youkuaiyun.com/ZHUhapi/article/details/138327961</guid><author>ZHUhapi</author><pubDate>Mon, 29 Apr 2024 23:06:25 +0800</pubDate><description><![CDATA[通过‘inode’的‘i_cdev’字段，驱动可以访问与设备相关联的‘cdev’结构，该结构                                 包含设备的核心信息和操作。Linux内核中因为MMU的存在不能直接访问物理地址，需要通过ioremap把虚拟地址映射到对应的物理地址，我们对虚拟地址的访问，会自动修改到对应的物理地址。device_destroy（）：第一个参数，设备类指针，哪个设备类。第三个参数：设备类型和编号的组成，MKDEV宏生成，代表设备的主设备号和次设备号。]]></description><category></category></item><item><title><![CDATA[设备树的引入和内核对设备树的处理]]></title><link>https://blog.youkuaiyun.com/ZHUhapi/article/details/137792307</link><guid>https://blog.youkuaiyun.com/ZHUhapi/article/details/137792307</guid><author>ZHUhapi</author><pubDate>Mon, 15 Apr 2024 19:29:14 +0800</pubDate><description><![CDATA[其他的单板A或单板B只需要include该文件，然后程序中可以引用相关设备的标签，来选择开启 或者关闭一些设备(如这里的uart0)，只需要修改它们的状态就好，很多代码就都不用编写啦。使用设备树的原因：每款芯片都会有很多不同的单板使用它，这样子每个单板都有自己的资源.c文件，引脚不相同，需要重新编译和包含了大量无用的代码，所以采用配置文件的方式加入内核（DTS）（2）如果of_match_table中含有type值，就跟dev的device_type属性 比较，若一致则成功，否则返回失败。]]></description><category></category></item><item><title><![CDATA[C++学习笔记：油管博主Cherno]]></title><link>https://blog.youkuaiyun.com/ZHUhapi/article/details/137791925</link><guid>https://blog.youkuaiyun.com/ZHUhapi/article/details/137791925</guid><author>ZHUhapi</author><pubDate>Mon, 15 Apr 2024 19:13:59 +0800</pubDate><description><![CDATA[（8）永远都不要在数组内存中访问数组的大小，但可以用sizeof()得到这个数组占了多少字节，然后除以它的数据类型的大小，得到数组元素个数(大小)。当你写一个应用程序并启动它时，整个的程序被载入内存，在你写的代码中，所有的指令告诉计算机要做什么，所有的这些都被加载到内存中，这就是CPU如何访问你的程序并执行指令的。（7）bool变量占用一个字节byte，但实际上只需要一个位bit，但由于计算机中的寻址是按字节byte来的，所以需要占用一个字节来找到它，我们也可以将8个bool存放在1个byte里。]]></description><category></category></item><item><title><![CDATA[Linux驱动进化：传统模型、设备总线驱动模型、设备树]]></title><link>https://blog.youkuaiyun.com/ZHUhapi/article/details/137399603</link><guid>https://blog.youkuaiyun.com/ZHUhapi/article/details/137399603</guid><author>ZHUhapi</author><pubDate>Fri, 05 Apr 2024 14:04:48 +0800</pubDate><description><![CDATA[先看platform_device，去platform_driver中找，不管谁先注册，device和driver都会两两比较。（2）但是这样子 每种资源都要定义一个resource如：led_resource、key_resource等，这样子不现实。（1）将使用led的引脚配置单独写成一个结构体，只需要提供要配置哪个引脚（如GPIO1_3）即可完成GPIO的配置。都会有一个.c，每次修改不同的引脚时，都会去改动到，会有大量的重复的.c，更换单板后需要修改的更多。（4）操作寄存器（给寄存器赋值配置）]]></description><category></category></item><item><title><![CDATA[FreeRTOS基本介绍、列表、移植、值得注意的点]]></title><link>https://blog.youkuaiyun.com/ZHUhapi/article/details/137399521</link><guid>https://blog.youkuaiyun.com/ZHUhapi/article/details/137399521</guid><author>ZHUhapi</author><pubDate>Fri, 05 Apr 2024 14:02:16 +0800</pubDate><description><![CDATA[17、在调度任务中，不同优先级任务，按优先级别高低顺序来执行，即抢占式任务调度策略，高优先级需要通过延时函数vTaskDelay(10)；释放自身CPU使用权，低优先级任务才能运行，同时同一优先级任务按时间片调度策略运行，每个任务只运行很短的时间1ms，最后若是两个任务相同，相当于同时完成。（FreeRTOS可管理的最大优先级(中断的)）优先级策略调度与FreeRTOS中的调度器所使用的调度算法（例如时间片轮转、抢占式调度算法）之间有密切的关系，因为优先级策略决定了任务在调度器中执行的顺序和方式。]]></description><category></category></item><item><title><![CDATA[Linux多进程、线程间通信：共享内存、信号量、管道、互斥锁]]></title><link>https://blog.youkuaiyun.com/ZHUhapi/article/details/137050622</link><guid>https://blog.youkuaiyun.com/ZHUhapi/article/details/137050622</guid><author>ZHUhapi</author><pubDate>Tue, 26 Mar 2024 16:44:21 +0800</pubDate><description><![CDATA[在中编写一应用程序，该程序包含三个进程，每个进程中包含两个线程，采用共享内存、信号量、管道等通信方式实现进程间的通信、同步、互斥操作。文章末尾附全部代码~（1）创建两个有名信号量sem_read和sem_write，一个用于读取共享内容，一个用于写入。是在程序使用的变量名，用来操作信号量的描述符。是系统中标识信号量的名字，用于的信号量通信和同步。（4）因为在该程序中，信号量是在父进程中创建的，所以所有的子进程和线程都可以直接用sem_read来使用信号量。它们共享父进程创建的资源（]]></description><category></category></item><item><title><![CDATA[Linux多进程、线程创建管理及状态切换]]></title><link>https://blog.youkuaiyun.com/ZHUhapi/article/details/137020144</link><guid>https://blog.youkuaiyun.com/ZHUhapi/article/details/137020144</guid><author>ZHUhapi</author><pubDate>Mon, 25 Mar 2024 17:33:23 +0800</pubDate><description><![CDATA[在嵌入式Linux中创建四个进程，2个实时进程，2个非实时进程。（2）sched_setscheduler（）函数：第一个参数为需要改变调度策略的目标线程，第二个参数为改变的调度策略，第三个参数为一个结构指针类型，用以指定调度优先级。（1）当pid==0时，说明此时代码运行是在子进程中，会退出该子进程，以免子进程继续创建子进程，父进程中的pid则为创建的子进程的pid号。第一个参数指向线程标识符的指针，第二个参数设置线程的属性，第三个参数是线程运行函数的起始地址，第四个参数为运行函数的参数。]]></description><category></category></item><item><title><![CDATA[侯杰C++ 面向对象高级开发—学习心得和笔记]]></title><link>https://blog.youkuaiyun.com/ZHUhapi/article/details/134125186</link><guid>https://blog.youkuaiyun.com/ZHUhapi/article/details/134125186</guid><author>ZHUhapi</author><pubDate>Mon, 30 Oct 2023 18:16:04 +0800</pubDate><description><![CDATA[也就是使用这个类的定义中已经写好的函数，把这些函数作为自己的函数。设计的结构：设计了一个subject包含数据，其中有容器（指针Delegation）指向了Oberver观察者(父类)，观察者会有几种不同的角度，每个角度对应着一个子类。18、当是函数内创建的变量时，返回值不能是引用reference，此时的变量在函数结束后，会被删除，当返回值传回去时，数据已经不存在了。否则，有的数组元素指向的内存块可能删除不完全(在数组元素为指针时，只将指针占用的内存块释放完，但是指针指向的数据内存并未释放完全)]]></description><category></category></item><item><title><![CDATA[C和指针-百句心得理解]]></title><link>https://blog.youkuaiyun.com/ZHUhapi/article/details/133754304</link><guid>https://blog.youkuaiyun.com/ZHUhapi/article/details/133754304</guid><author>ZHUhapi</author><pubDate>Tue, 10 Oct 2023 19:48:16 +0800</pubDate><description><![CDATA[在阅读完《C和指针》后得出的重要心得，在编程遇到困难时，或许将起到醍醐灌顶的作用。也将更好的帮助理解C语言的执行过程，带来对C语言新的感悟。1、get()函数从输入缓冲区(键盘输入)读取一个字符串存储到指针变量str所指向的内存空间。2、“Hello”字符串在内存中占6个字节，最后一个是“NUL”。但字符串长度并不包含“NUL”3、“NUL”是ASCII字符集中‘\0’字符的名字。而“NULL”是值为0的指针。]]></description><category></category></item><item><title><![CDATA[Python中--类的使用和基础概念]]></title><link>https://blog.youkuaiyun.com/ZHUhapi/article/details/132766908</link><guid>https://blog.youkuaiyun.com/ZHUhapi/article/details/132766908</guid><author>ZHUhapi</author><pubDate>Fri, 08 Sep 2023 20:18:49 +0800</pubDate><description><![CDATA[将实例作为类的属性后，每当方法__init( )__被调用时，都将创建一个新的Battery实例，并将实例存储在属性self.battery中，每个ElecticCar实例都包含一个自动创建的Battery实例。类中的函数都称为方法，__init( )__则是一个特殊的方法，每次用类创建实例时，python都会自动执行它。类中的每个属性必须有初始值，若在方法__init__( )内已经指定了属性的初始值，则无需在创建实例时再给该属性提供初始值的形参。可以将实例用作类的一个属性，以简化代码，更具逻辑性。]]></description><category></category></item><item><title><![CDATA[CPU、GPU和CUDA之间的关系及基础概念]]></title><link>https://blog.youkuaiyun.com/ZHUhapi/article/details/132700596</link><guid>https://blog.youkuaiyun.com/ZHUhapi/article/details/132700596</guid><author>ZHUhapi</author><pubDate>Tue, 05 Sep 2023 21:16:27 +0800</pubDate><description><![CDATA[在CUDA架构中，主程序由CPU执行，当遇到数据并行处理的部分，CUDA会将程序编译成GPU能执行的程序，并传送到GPU。CPU主要包括运算器（Arithmetic and Logic Unit，ALU）、控制单元（Control Unit，CU）、寄存器（Register）、高速缓存器（Cache）和通信的数据、控制及状态总线。（主要是并行计算部分）一般情况下，CPU执行主机端的程序会准备好数据并将其复制进显卡内存中，然后设备端程序由GPU执行完后，主机端程序会将生产的数据结果从显卡内存中取回。]]></description><category></category></item><item><title><![CDATA[深度学习重要基础知识（踩过的坑）]]></title><link>https://blog.youkuaiyun.com/ZHUhapi/article/details/131968867</link><guid>https://blog.youkuaiyun.com/ZHUhapi/article/details/131968867</guid><author>ZHUhapi</author><pubDate>Thu, 27 Jul 2023 21:30:50 +0800</pubDate><description><![CDATA[表示参数w5对误差的贡献。n为学习率，代入loss后可对权重值w5进行更新，若loss越大，即结果和真实值差距越大，则w5变化越大。loss通常由损失函数得到，损失函数常见的由MSE均方误差和CorssEnropy交叉熵损失函数。这里使用的是SGD随机梯度下降法，此外还有Adam等权重更新方法。该误差（loss）使用的计算公式为MSE。若想理解整个过程，可参考。]]></description><category></category></item><item><title><![CDATA[Modbus-RTU需要特别关注的点（及容易被遗漏忽视的地方）]]></title><link>https://blog.youkuaiyun.com/ZHUhapi/article/details/131522060</link><guid>https://blog.youkuaiyun.com/ZHUhapi/article/details/131522060</guid><author>ZHUhapi</author><pubDate>Mon, 03 Jul 2023 20:37:17 +0800</pubDate><description><![CDATA[本文主要介绍了Modbus-RTU使用和编写过程中需要特别注意的关键知识点，及容易被遗漏忽视的地方。]]></description><category></category></item><item><title><![CDATA[嵌入式-stm32重要基础知识（及踩过的坑）]]></title><link>https://blog.youkuaiyun.com/ZHUhapi/article/details/130344689</link><guid>https://blog.youkuaiyun.com/ZHUhapi/article/details/130344689</guid><author>ZHUhapi</author><pubDate>Mon, 24 Apr 2023 16:06:17 +0800</pubDate><description><![CDATA[ARM 是一个做芯片标准的公司，它负责的是芯片内核的架构设 计，而 TI，ST 这样的公司，他们并不做标准，他们是芯片公司，他们是根据 ARM 公司提供的 芯片内核标准设计自己的芯片。（1）寄存器组、（2）NVIC、（3）中断和异常、（4）储存器映射、（5）总线接口、（6）调试支持（debug interface）、（7）指令集。所以，任何一个做 Cortex-M3 芯片，他们的内核结构都是一样的，不同的是他们的存储器容量，片上外设，IO 以及其他模块的区别。2、CMSIS标准与固件库的关系。]]></description><category></category></item></channel></rss>