- 博客(40)
- 资源 (16)
- 收藏
- 关注
原创 C语言 左移溢出
2. 左移操作中,若常量移位到符号位,会得到错误的结果(如图变量b c),具体错误的结果依赖于编译器的实现方式,此时需要进行强制类型转换(如图变量a d)1. 在c语言中,常量的默认类型为signed int(如图变量b c)
2023-03-03 15:32:20 632
原创 嵌入式C常见面试题
1. 展开的时机:inline函数在编译时展开,#define在预处理时展开 2. 参数的类型检查: inline函数还是一个函数,会进行参数类型检查,而#define不会,只是做简单的字符串替换 3. 是否允许复杂语句:inline函数不允许出现复杂语句,例如递归,大型循环等;#define一定展开。对应短小精悍且被频繁调用的函数,加上inline关键字会在编译时在函数调用位置替换为函数的代码块,节省函数调用的时间和对栈内存重复开辟带来的消耗,代价上增加了程序文件的大小。
2022-10-21 09:43:58 240
原创 NAND FLASH -WARMUP CYCLE
当NAND interface速度在800MB/s以上时,为了增加信号传输的稳定度,可以使用warmup cycle(DQS latency cycle)。warmup cycle主要时在burst read/write开始之前,加入几个cycle的dummy data,用来sync DQ/DQS, 使sampling 更加准确。...
2022-08-07 09:24:49 1392 1
原创 Linux常用命令
xz命令 xz -z test.txt 压缩文件 xz -d test.txt.xz 解压文件 xz test.txt 压缩文件 unxz test.txt.xz 解压文件 xzcat test.txt.xz 查看文件内容tar命令# 压缩文件 file1 和目录 dir2 到 test.tar.gztar -zcvf test.tar.gz file1 dir2# 解压 test.tar.gz(将 c 换成 x 即可)tar
2021-07-15 10:03:42 102
原创 NAND Read Error
NAND FLASH基本存储单元(Cell)是一种类NMOS的双层浮空栅(Floating Gate) MOS管组成 。写操作是在控制极加正电压,使电子通过绝缘层进入浮栅极。擦除操作正好相反,是在衬底加正电压,把电子从浮栅极中吸出来。如下图所示:一个存储单元存储1bit数据的NAND FLASH,我们叫它为SLC (Single Level Cell),2bit为MLC (Multiple Level Cell),3bit为TLC (Triple Level Cell...
2021-05-17 17:05:10 1130
原创 概念区分之LUN、die、target、channel
在nand里,LUN(Logical Unit)和die是同一个意思。都是执行cmd和report status的最小单位。一个target对应一个CE、R/B信号线。根据封装的不同,target里可能会有一个或多个die。spec原文如下:1 die target2 die targetchannel 表示有几组ALE、CLE、IO[7:0]、DQS、RE、WE、WP信号线。...
2021-04-02 10:01:55 10528 2
原创 OLED SH1106通过I2C显示
预备知识1. I2C基本原理2. SH1106通过I2C读写OLED初始化#define OLED_CMD 0 #define OLED_DATA 1/**********************************************// IIC Write Command**********************************************/void Write_IIC_Command(unsigned char IIC_Command
2021-03-22 10:52:12 2884 2
原创 局部变量定义顺序与地址顺序
局部变量的定义顺序与存储顺序不一定一致,具体与编译器和平台相关。从编译器的角度来说,变量的地址是可以随机安排的,又不影响寻址使用,不一定非要按排列顺序。一般而言,编译器按照内存地址递减的方式给局部变量分配内存,如下图:...
2021-03-18 10:06:39 806
原创 I2C
The I2C-bus is for bi-directional, two-line communication between different ICs or modules.I2C (Inter Integrated Circuit,内部集成电路) 总线是价格低廉却很有效的用以互连小规模嵌入式系统内的外设的网络。I2C 总线用两根线来连接多支路总线中的多个设备。这种总线是双向、低速的,并与公共时钟同步。可以直接将一个设备接到 I2C 总线上或是从该总线上取下,而不会影响其他设备。I2C 总线的数
2021-03-12 14:03:15 290
原创 概念解释之持续集成
continuous integration(CI) is the practice of merging all developer working copies to a shared mainline several times a day.持续集成的含义是:频繁的(一天多次的)将所有开发者的工作合并到主干上。持续集成是一种软件开发实践,即团队开发成员更加频繁的集成他们的工作,通常每个成员每天至少集成一次。每次集成都通过自动化的构建(包括自动编译,自动生成部署包、自动发布测试环境,自动化测试) .
2021-03-12 13:53:37 1144
原创 概念区分之时钟周期、机器周期、指令周期
时钟周期时钟周期也称为振荡周期,定义为时钟脉冲的倒数 (可以这样来理解,时钟周期就是单片机外接晶振的倒数,例如 12M 的晶振,它的时间周期就是 1/12 us),是计算机中最基本的、最小的时间单位。机器周期机器周期也称为 CPU 周期。在计算机中,为了便于管理,常把一条指令的执行过程划分为若干个阶段(如取指、译码、执行等),每一阶段完成一个基本操作。完成一个基本操作所需要的时间称为机器周期。一般情况下,一个机器周期由若干个时钟周期组成。例如,MCS-51 采用定时控制方式,有固定的机器周期
2021-03-11 13:54:10 821
原创 位运算常用技巧
1、获得第 i 位的数字(a>>i)&12、设置第 i 位为 1a=a|(1<<i)3、设置第 i 位为 0a=a&(~(1<<i))4、把第 i 位取反a=a^(1<<i)5、lowbit函数(用来取一个二进制最低位的1与后边的 0 组成的数)方法一:a&(-a) ,原理:二进制数的负数是正数取反加一方法二: a - ( a & (a-1) ),原理: 先消掉最后一位1,然后再用原...
2021-03-03 13:47:27 323
原创 前缀和
预备知识前缀和是一个数组的某项下标之前(包括此项元素)的所有数组元素的和。设a[]为原数组,b[]为前缀和数组,可得,前缀和的定义式和递推式如下图所示:其中,一维数组的前缀和的递推式可以很容易看出来,二维数组的前缀和的递推式证明如下:如图,灰色阴影的面积 S(O,D)=S(O,C)+S(O,B)−S(O,A)+D。设preSum[i][j]表示从matrix[0][0]到matrix[i][j]的所有元素的和,则可以得出以下的递推公式:preSum[i][j]=preSum[i−1]
2021-03-02 15:11:27 139
原创 异或
异或,英文为 exclusive OR,缩写成 xor。异或的数学符号为 “⊕”,C语言中的运算符为“^”。异或也叫半加运算,其运算法则相当于不带进位的二进制加法:二进制下用 1 表示真,0 表示假,则异或的运算法则为:0⊕0=0,1⊕0=1,0⊕1=1,1⊕1=0(同为 0,异为 1)。运算法则1.归零律:a ⊕ a = 02.恒等律:a ⊕ 0 = a3.交换律:a ⊕ b = b ⊕ a4.结合律:a ⊕b ⊕ c = a ⊕ (b ⊕ c) = (a ⊕ b) ...
2021-02-24 15:19:30 4821 1
原创 Leetcode中参数returnSize和returnColumnSizes的解释
Leetcode中,一些题目会传入 returnSize 和 returnColumnSizes 这两个参数。例如:int** flipAndInvertImage(int** A, int ASize, int* AColSize, int* returnSize, int** returnColumnSizes)之所以传入指针,是因为C语言是值传递,如果传的是值,无法改变传入的值。题目中要求会返回一个二维数组,且数组的行数列数是可能被function改变的。在这个题目中,二维数组A的行数是
2021-02-24 14:51:33 4646 2
原创 向上取整
在C语言中,取整操作总是把小数部分截断。因此当操作数为正的时候,相当于向下取整。以下讨论的方法都是操作数为正的情况,操作数为负和浮点数的情况不作讨论。方法一:检查余数int func1(int x, int n){ int remainder; int sum = x / n; if( x % n ) { sum++ } return sum;}方法二:增加一点小处理(推荐)int func1(int x, int
2021-02-04 10:54:31 1159
原创 地址与内存空间
数据总线,地址总线,运算位宽32位CPU指的是运算位宽为32位,通常也是指的是通用寄存器的位宽。CPU通过地址总线寻址,然后通过数据总线与外设通信。地址总线位数决定CPU寻址范围;数据总线的位数决定CPU单次通信能交换的信息数量。CPU位宽与寻址能力并不完全等效,具体看CPU的设计:CPU 的位宽一般是以min {ALU 位宽、通用寄存器位宽、数据总线位宽} 决定的!也就是说 CPU 由 ALU、通用寄存器、数据总线三者之中最少的位宽决定!所以 CPU 位宽与其寻址能力并不是挂钩的!也.
2021-02-02 14:32:25 891 1
原创 递归算法debug技巧
在debug递归函数的时候,最常见的做法是在IDE里一步一步打断点下去看。但是有一个问题是容易绕晕。这里分享一个比较直观方便的技巧,参考自<<分享一个小技巧,提高刷题幸福感>>。在递归函数中,缩进最能提升我们debug的效率。打印关键值,配合缩进,可以更加直观地观察递归函数执行情况。因此我们新定义一个函数printIndent和一个全局变量count:// 全局变量,记录递归函数的递归层数int count = 0;// 输入 n,打印 n 个 tab 缩进...
2021-01-28 16:36:03 1640
原创 C Training 1
singly-Linked List//// singly-linked list structure//typedef struct _LINK{ struct _LINK xdata *pLink;} LINK, xdata *PLINK;//// link head structure//typedef struct _LINK_HEAD{ PLINK pHead; PLINK pTail;} LINK_HEAD, xdata *PLINK_.
2021-01-27 14:30:19 183
原创 C Training 2
Doubly-Linked List////doubly-linked list structure//typedef struct _LIST_ENTRY{ struct _LIST_ENTRY xdata *pFLink; struct _LIST_ENTRY xdata *pBLink;} LIST_ENTRY, xdata *PLIST_ENTRY;////ListInitializeHead// initialize the head of a doubly-
2021-01-27 14:29:54 95
原创 C Training 3
#include <stdtypes.h>#define HEAD_SIZE (sizeof(HEAD_STRUCT))////control block structure//typedef struct _HEAD_STRUCT{ UINT size;// data block size struct _HEAD_STRUCT xdata *pFLink;// next structure pointer} HEAD_STRUCT, xdata *PHEA...
2021-01-27 14:29:00 143
原创 插入排序
直接插入排序基本思想将一个记录插入到已经排好序的有序表中,从而一个新的、记录数增 1 的有序表。在其实现过程使用双层循环,外层循环对除了第一个元素之外的所有元素,内层循环对当前元素前面有序表进行待插入位置查找,并进行移动。C实现(默认升序排列)void InsertSort(int *arr, int len){ int tmp; int i; int j; for (i = 1; i < len; i++) { tmp = arr[i];//待插入的元素 f
2021-01-26 14:58:12 80 2
原创 匿名联合/结构体
GCC (https://gcc.gnu.org/onlinedocs/gcc-4.6.2/gcc/Unnamed-Fields.html#Unnamed-Fields) 允许在联合/结构体中定义一个无名称的联合/结构体,例如:struct { int a; union //无名称的联合 { int b; float c; }; int d;} foo;可以直接访问无名称联合体的成员,例如: foo.b。如果直接定义一
2021-01-21 17:33:09 871
原创 常量的默认类型与移位
常量的默认类型C语言中的常量分为整形常量、浮点数常量、字符常量、字符串常量。整型常量的默认数据类型是int类型,即有符号整型。浮点数常量的默认类型是double类型,即长浮点数类型。字符常量的默认类型是char类型,即有符号字符类型,字符串常量的类型,一般为const int类型。同时,不同的编译器,略有不同,但一般遵守该规则。数据类型对应字节数 引用:https://blog.csdn.net/zhangxinbin5/article/details/7929591不同...
2021-01-19 13:52:45 2280
原创 SSD TRIM命令
TRIM(SATA), Deallocate(NVMe), UNMAP(SCSI)指的是同一类指令,都是为了减少不必要的数据搬移。原因:在文件系统中,删除文件并没有真正的删除物理的数据,只是清空了记录表。而此时,对SSD来说,它并不知道文件已经被删除了,只有下次覆写的时候,SSD才能发现之前被删除的文件对应的page是无效的,从而启动GC。然而,如果在此之前发生了GC等数据搬移动作,无效的page仍然会被当做是有效的。作用:Trim 只是一个指令,它让操作系统通知 SSD 主控某个页的数据已
2020-11-25 15:40:08 2959
原创 概念解释之SRAM,DRAM,流水线,中断
SRAM and DRAMSRAM:价格高,速度快DRAM:价格相对低些,速度比SRAM慢,需要对电容状态进行保持和刷新处理流水线CPU 流水线 (CPU pipeline):CPU 流水线一种将指令分解为多步,并让不同指令的各步操作重叠,从而实现几条指令并行处理,以加速程序运行过程的技术。指令的每步有各自独立的电路来处理,每完成一步,就进到下一步,而前一步则处理后续指令中断中断:当出现来自系统外部,机器内部,甚至处理机本身的任何例外的,或者虽然是事先安排的,但出现在现行程序的什么
2020-11-23 10:38:16 564
原创 Record -> C
用malloc给指针分配空间1. 分配的是数组时,malloc大小应为数组大小ex:int *a = (int *)malloc(sizeof(int)*N) //note: 分配的是数组时,malloc大小应为数组大小数组作为函数返回值1. 返回的数组不能是定义在函数内的数组。 因为函数内定义的数组是局部变量,函数结束时被释放。虽然没有语法错误,但是地址里的值已经没有意义。头文件重复包含的问题#ifndef X //X为标识符,可以随便取名一般取名为大写的头文...
2020-11-23 10:31:54 191
原创 Record -> Linux简单命令
Linux:普通用户切换root用户: su rootroot用户切换普通用户:su 用户名编译:gcc 源文件名.c -o 目标文件名运行:./文件名退出cat命令:ctrl + C/ctrl + DVim:编辑模式: i退出编辑模式:Esc保存并退出::+ wqcd 命令跳至上层目录 cd .. 跳入用户主目录 cd ~ ...
2020-11-23 10:28:53 374
原创 NVMe从入门到放弃
Queue PairNamespaceA namespace is a quantity of non-volatile memory that may be formatted into logical blocks 如果把闪存空间划分成若干个独立的逻辑空间,每个空间逻辑块地址(LBA)范围是 0 到 N-1 (N 是逻辑空间大小),这样划分出来的每一个逻辑空间我们就叫做 NSNS 由 Host 创建和管理,每个创建好的 NS,从 Host 操作系统角度看来,就是一个独立的磁.
2020-11-23 10:23:34 1004
原创 概念区分之 M.2, PCIe, NVMe
NVMe, AHCI and IDE are transfer protocols (languages). They run on top of transfer interfaces such as PCIe or SATA (spoken, written).NVMe,AHCI 和 IDE 是传输协议(语言)。 它们运行在诸如 PCIe 或 SATA(口头,书写)之类的传输接口之上。M.2 更多的指的是主板上的硬件接口,而 SATA/PCI-E 则更多的指的是一种数据传输通道,而 AHC..
2020-09-16 17:10:53 8727
原创 概念区分之 进程与线程
进程(Process):每个进程都有自己独立的地址空间,使得进程之间的地址空间相互隔离。进程的总体目标是希望每个进程从逻辑上来看都可以独占计算机的资源。线程(Thread): 优势被称为轻量级进程(Lightweight Process,LWP),是程序执行流的最小单元。一个标准的线程由线程ID,当前指令指针(PC),寄存器集合和堆栈组成。区别和联系:通常意义上,一个进程由一个到多个线程组成,各个线程之间共享程序的内存空间(包括代码段,数据段,堆等)及一些进程级的资源(如打开文件和信号)。
2020-09-10 14:03:59 155
转载 Page Register
对Nand flash来说,读写是以page为单位。对于flash中的每个plane,都有一个page register(或者叫cache register, data register),用于存放将要写入到物理存储单元中去的或者刚从存储单元中读取出来的数据。也就是说,nand flash的数据流向如下图所示:...
2018-09-27 09:08:30 1925
转载 Nand flash相关概念介绍
1. SDR/DDRSDR(Single Data Rate): 读写数据使用上升沿或下降沿。DDR(Double Data Rate):写数据时通过MCU来控制DQS信号跳变沿来触发(即上升沿和下降沿均触发)。2. 同步/异步Sync模式是指Flash操作时需要一个源时钟来对锁存信号进行同步,提高信号采集的准确性。Async,即不需要时钟信号来进行同步,数据通过WEN...
2018-09-26 11:08:27 1595
原创 C 可变参数函数的实现方法
基本原理在C中,函数形参从右往左入栈,且栈是从高地址往低地址方向增长。通过利用指针,可以访问未出现在列表中的参数。实现步骤相关宏定义如下://define in stdarg.h#define va_start __crt_va_start#define va_arg __crt_va_arg#define va_end __crt_va_end//define...
2018-09-06 13:36:43 1526
原创 eMMC Summary
1. overview11-wire bus : clock, data strobe, 1 bit command , 8 bit data bus DAT0 low :busy2. Message Tokens• Command: token that starts an operation• Host to device• CMD line• Response...
2018-08-07 17:03:50 407
原创 学习小结之 MFC
问题1:MFC列表框中内容不按照添加的顺序显示解决:控件属性->行为->sort->false设置编辑框变灰且不可输入:GetDlgItem(IDC_EDIT1)->EnableWindow(FALSE);清除编辑框中已经显示的内容:GetDlgItem(IDC_EDIT1)->SetWindowText(L"");L””等于CString类型的NULL,不等于一般的...
2018-06-28 09:31:30 346
原创 学习小结之 Git
## Git 学习总结### Git简介> Git是一个开源的分布式版本控制系统,可以有效、高速的处理从很小到非常大的项目版本管理。Git 是 Linus Torvalds 为了帮助管理 Linux 内核开发而开发的一个开放源码的版本控制软件。### Git 环境配置**1.**[下载](https://github.com/git-for-windows/git/releases/do...
2018-06-20 19:07:35 125
JESD84-B51_eMMC 5.1_x3.pdf
2020-09-17
PCI Express Base Specification Revision 5.0 Version 1.0.pdf
2020-09-17
git学习总结
2018-06-29
VS code c语言配置文件
2018-06-29
MFC学习心得
2018-06-28
Cx51学习总结
2018-06-28
Ax51学习总结
2018-06-28
8051学习总结
2018-06-28
c程序设计语言学习总结
2018-06-27
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人