- 博客(27)
- 资源 (4)
- 收藏
- 关注
![](https://csdnimg.cn/release/blogv2/dist/pc/img/listFixedTop.png)
原创 《Linux设备驱动程序》读书笔记
《Linux设备驱动程序》读书笔记第一章 设备驱动简介Linux内核源码复杂,学习起来需要一个切入点,设备驱动提供了这样的门路。驱动程序的角色是提供机制,而不是策略;机制是提供什么能力,策略是如何使用这些能力。例如ftpd协议提供文件传输机制(机制),而用户可以选择使用自己喜欢的客户端(策略)。编写内核代码来存取硬件, 但是不能强加特别的策略给用户, 因为不同的用户有不同的需求. 驱动应...
2019-11-14 15:36:58
235
原创 函数解读:ioremap、ioremap_cached、ioremap_wc
1. 本文关注的问题在编写linux驱动过程中,不可避免的会涉及操作外设,而外设的地址空间与DDR的地址空间一般不连续,在linux上电时,并不会为外设地址空间建立页表,又因为linux访问内存使用的都是虚拟地址,因此如果想访问外设的寄存器(一般包括数据寄存器、控制寄存器与状态寄存器),需要在驱动初始化中将外设所处的物理地址映射为虚拟地址,linux为应对该问题提供了较多接口,包括ioremap/ioremap_wc/devm_ioremap/devm_ioremap_resource等,以应对不同的场景
2021-05-16 00:19:16
11843
原创 ARM Memory type & Memory attribute简介
ARM Memory type & Memory attribute简介arm memory类型分为normal memory和device memory。normal memorynormal memory就是我们平常所说的内存,对该种memory访问时无副作用(side effect),即第n次访问与第n+1次访问没有任何差别(对比device memory的side effect特性,更容易理解一些)。进一步地,通过memory attribute可以对normal memory进行细
2021-05-15 15:57:13
3341
原创 cscope添加绝对路径,解决跳转时file not exist问题
问题描述使用cscope进行代码跳转时,会出现cscope: cannot find file XXX的错误。解决方案由于cscope生成数据库时默认使用相对路径,因此会出现以上情况。解决办法是手动生成一个cscope.files文件,指定好文件的绝对路径。cscope命令会根据cscope.files中指定的文件,生成符号索引文件。因此在生成cscope.files时,将所有文件以绝对路径的形式呈现,即能解决cscope跳转时找不到文件的问题。find `pwd` -name *.c > c
2021-02-21 21:36:30
2433
原创 Leetcode #7整数反转 C++
题目给出一个 32 位的有符号整数,你需要将这个整数中每位上的数字进行反转。分析有两种思路,第一种是数学运算(包括对10的取余、取商等运算),第二种是先转化为字符串再反转(值得尝试一下)。但是后者需要用到较多库函数,效率较低。选用数学运算方式,最困难的地方是注意溢出条件。(转自leetcode上的用户:灵魂画师牧码,详情请点击此处)溢出条件有两个,一个是大于整数最大值MAX_VALUE...
2019-12-18 12:10:01
142
原创 二重指针的应用场景
当指针作为参数传递的时候,两种情况需要使用二重指针:改变指针所指向的地址,比如如下例子:#include <stdio.h>void change(char *v){ v = "bbb";}int main(int argc, char *argv[]){ char *p = "aaa"; change(p); printf("%s\n",p); retu...
2019-12-12 10:26:36
602
原创 《Unix网络编程 3rd edition》读书笔记
第一部分 TCP/IP简介第二章套接字对(socket pair):定义连接的两个端点的四元组:本地IP、本地TCP端口、外地IP、外地TCP端口。Socket pair唯一标识一个网络上的每个TCP连接。其中,标识每个端点的两个值(IP地址和端口号)通常称为一个套接字(Socket)。 Notice:即使UDP是无连接的,但提到套接字时依然是指本地IP地址和本地端口号。2.10节的“TC...
2019-12-09 18:00:22
175
转载 【Linux开发】arm-linux-gnueabihf-gcc下载
原文地址:http://www.veryarm.com/arm-linux-gnueabihf-gccveryarm是个不错的网站,里面介绍了很多相关的基础知识。arm-linux-gnueabihf-gcc是由 Linaro 公司基于GCC推出的的ARM交叉编译工具。可用于交叉编译ARM系统中所有环节的代码,包括裸机程序、u-boot、Linux kern...
2019-11-20 15:59:39
537
原创 Git学习记录
创建版本库总结来说就是三步:(<>只是一种指示,实际的命令中不包含)在一个文件夹下,git init初始化,将仓库建好;git add < file > ,把文件添加到仓库;git commit -m < “message” >,把文件提交到仓库;查看仓库状态两个命令:git status可以让我们时刻掌握仓库当前的状态,即哪些文件修改过了...
2019-11-14 18:05:50
123
原创 《自己动手写CPU》读书笔记
流水线的引入:为了提高计算机指令处理的速度,将处理过程拆分,并通过多个硬件单元并行执行,来加快处理速度。(1)一般而言,三级流水是最基本的形式:取指、译码、执行。其中取指阶段涉及ROM的访问,会比较慢,拖累整个流水线的进度,解决取指时间过长的方法是:引入缓存(Cache),ARM7为三级流水。(2)另一种情况是执行时间过长,涉及到Load/Store的指令,因为需要访问ROM,可能会导致流水...
2019-11-14 15:35:58
262
原创 GDB常用操作记录
GDB 常用操作断点添加断点:b <行号>;b <函数名>;查看断点:info b;简写就是i b;删除断点:先查看断点序号,然后 d <断点序号>;一般操作开始:start退出:quit继续:c下一段代码:n(next)下一句代码:s(step)显示代码:l(list)默认情况下,GDB显示指定位置处以及其前后的10行代码,但...
2019-11-14 15:35:41
119
原创 《Linux命令行与shell编程脚本编程大全.第3版》
第四章 更多的bash shell命令进程管理类命令ps -ef 最为常用,ef的意思是以完整格式显示所有进程ps命令的格式有三种:Unix风格、BSD风格、GUN风格。我们常用Unix风格的,即参数前有一个破折号。top命令:为什么有了ps还需要top命令?原因是ps命令只能显示运行ps时的进程信息,如果想要实时监控进程,用top。同时top还能提供系统的平均负载等信息。结束进程有两...
2019-11-14 15:34:36
123
原创 atexit函数详述
atexit函数用来注册终止函数,简单说即当main函数执行结束后调用的函数,严格来说是进程执行完将要退出前,exit调用的一些收尾函数。atexit注册的函数类型应为不接受任何参数的void函数,即atexit(void(*func)(void))。exit调用这些注册函数的顺序与它们注册的顺序相反,同一个函数可以登记多次,则也会被调用多次。在头文件<stdlib.h>中。...
2019-11-14 15:32:24
723
原创 《深入理解计算机系统(第3版)》读书笔记(持续更新)
第一章 计算机系统漫游执行一个hello world程序的步骤:(1)第一步,shell中键入"./hello"字符串之后,字符串先到寄存器,再到内存。具体来说是:键盘 --> I/O桥 --> 总线接口 --> 寄存器–> 总线接口 --> I/O桥 -->** 内存**。(2)第二步,键入回车。从磁盘把可执行文件运输到内存中,利用DMA技术可以不通过...
2019-05-26 10:41:25
597
原创 C语言中的volatile关键字
volatile经常用于嵌入式C语言程序中,目的是不让编译器对其修饰的变量进行优化。详细来说,编译器在把C语言程序编译成汇编语言时,会对程序进行优化,频繁用到的变量可能会直接存储在寄存器中,下次直接来寄存器读值,但是嵌入式环境下,某个内存地址的值是很容易被中断、多线程等因素修改的,当读取这样的内存地址(变量)的时候,应该去内存中读取而不是再读寄存器中的旧值,因此嵌入式软件开发人员要善于使用vol...
2019-05-16 15:14:51
371
原创 《C++ primer(第5版)》读书笔记(持续更新)
第三章string是可变长字符串,vector是可变长集合,标准库定义了这些具有更高级性质的类型,它们尚未直接实现到计算机硬件中。(不像int和char)头文件中不应该含有using声明,因为头文件的内容会拷贝到引用了它的文件中去,也许会造成意想不到的命名冲突。stringstring s1 = “hiya”; 拷贝初始化(使用等号初始化一个变量时)string s2(“hiya”)...
2019-05-12 16:34:46
276
原创 关于“C语言二维数组的动态申请”的一些tips
吃过好几次二维数组动态申请的亏,现在总结一下。什么时候需要动态申请内存呢?当输入的数组大小不能事先确定;同时你还想优化内存的使用,而不是简单的定义一个大数组时(例如:int a[1000000])二维数组的动态申请一维数组的动态申请这里不再赘述,相信大家经常能遇到也很熟悉,我们主要关心不常用的二维数组动态申请。先上代码:scanf("%d %d",&row,&co...
2019-05-08 10:24:02
199
原创 C语言实现《剑指offer》——12打印1到最大的N位数(注释详尽)
本篇是第12题_打印1到最大的N位数的C语言实现:题目描述:给定一个数字N,打印从1到最大的N位数。输入:每个输入件仅包含一组测试样例。 对于每个测试案例,输入一个数字N(1<=N<=5)。输出:对应每个测试案例,依次打印从1到最大的N位数。样例输入:1样例输出:1 2 3 4 5 6 7 8 9分析考虑大数问题,即当输入的数字的最大N超过了int、long ...
2019-04-24 11:41:10
238
原创 C语言实现《剑指offer》——11数值的整数次方
本篇是第11题_数值的整数次方的C语言实现:题目描述:实现函数double Power(double base, int exponent),求base的exponent次方。不得使用库函数,同时不需要考虑大数问题。需要注意的点:scanf()在扫描double的时,应该使用"%lf";而在printf()时,“%f”和“%lf”都可以;注意指数为负以及底数为0这些特殊情况的处理。代...
2019-04-22 20:07:06
294
原创 C语言实现《剑指offer》——10_二进制中1的个数(两种方法实现)
本篇是10_二进制中1的个数的C语言实现:题目描述:输入一个整数,输出该数二进制表示中1的个数。其中负数用补码表示。本文采用两种方式实现,我称他们为normal方法和surprise方法,他们的区别如下:normal使用的是循环移位,因为考虑到有符号数负数右移,左边空位补1的情况,因此定义了一个无符号的flag初始化为1,并让flag循环左移,与输入相与,便能得到输入中1的个数。这种办法属...
2019-04-22 19:57:19
293
原创 C语言实现《剑指offer》——09_斐波那契数列(循环实现,效率远高于递归)
本篇是第9题_斐波那契数列的C语言实现:题目描述:大家都知道斐波那契数列,现在要求输入一个整数n,请你输出斐波那契数列的第n项。用递归方法实现的代码量很小,但是时间复杂度是O(n^2),本文采用循环实现,时间复杂度降为O(n).代码如下:#include <stdio.h>#include <stdlib.h>unsigned long long ...
2019-04-22 19:45:48
408
原创 C语言实现《剑指offer》——08旋转数组中的最小数字
本篇是第8题_旋转数组中的最小数字的C语言实现:题目描述:把一个数组最开始的若干个元素搬到数组的末尾,我们称之为数组的旋转。输入一个递增排序的数组的一个旋转,输出旋转数组的最小元 素。例如数组{3,4,5,1,2}为{1,2,3,4,5}的一个旋转,该数组的最小值为1。代码如下:#include <stdio.h>#include <stdlib.h>#defin...
2019-04-22 19:38:54
271
原创 C语言实现《剑指offer》——07用两个栈实现队列(注释详尽)
本篇是第7题_用两个栈实现队列的C语言实现:题目描述:用两个栈来实现一个队列,完成队列的Push和Pop操作。#include <stdio.h>#include <string.h>#define N 1000int main (int argc, char *argv[]){ freopen("sample.txt","r",stdin); int Op...
2019-04-22 19:34:11
353
原创 C语言实现《剑指offer》——06重建二叉树(注释详尽)
本篇是第6题_重建二叉树的C语言实现:题目描述:输入某二叉树的前序遍历和中序遍历的结果,请重建出该二叉树。假设输入的前序遍历和中序遍历的结果中都不含重复的数字。例如输入 前序遍历序列{1,2,4,7,3,5,6,8}和中序遍历序列{4,7,2,1,5,3,8,6},则重建二叉树并输出它的后序遍历序列。//前序遍历第一个节点确定根节点,然后在中序遍历中寻找根节点,从而确定左、右子树,对左右子树...
2019-04-22 19:28:29
973
2
原创 C语言实现《剑指offer》——05从尾到头打印链表
本篇是第5题_从尾到头打印链表的C语言实现:题目描述:输入一个链表,从尾到头打印链表每个节点的值。解法1:链表倒序的数组实现#include<stdio.h>#include<stdlib.h>#define N 1000typedef struct node // 复习typedef的基础知识!!!!!!!{ int data; struct ...
2019-04-22 16:58:44
514
原创 C语言实现《剑指offer》——04替换空格
本篇是第4题_替换空格的C语言实现:题目描述:请实现一个函数,将一个字符串中的空格替换成“%20”。例如,当字符串为We Are Happy.则经过替换之后的字符串为We%20Are%20Happy。代码如下:#include<stdio.h>#include<string.h>#define N 1000void ReplaceBlank(char*,in...
2019-04-22 16:26:30
245
原创 C语言实现《剑指offer》——03二维数组中的查找
一直以来都想有个自己的技术博客,但始终没有明确自己的技术方向,今天学学python明天看看java的,很迷茫。经历了研二下学期两个月以来的找实习过程,终于想明白了自己要坚持的技术路线:嵌入式全栈工程师,从"嵌入式应用层软件"到"Linux驱动"再到“Linux操作系统与内核”。要学习和掌握的内容很多,但在强烈的好奇心驱使下,这反而是一件令人兴奋的事,因为花时间去领略前辈们在这个领域留下的精彩,本就...
2019-04-21 17:53:47
668
数据预处理ppt(内容包括总体介绍_标准化与正则化_缺失值处理_降维处理)
2018-12-26
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人