- 博客(42)
- 资源 (1)
- 收藏
- 关注
原创 F103 FSMC代码移植至H743问题总结
2.未将FSMC相关引脚复用为FSMC功能,导致极其离奇的问题。如FSMC发送函数放在if(res==OK)语句之前可以正常发送,逻辑分析仪能抓到数据。放在if(res==OK)之中就不会有任何数据发出来,如果改为if(1)就能正常发送。1.未在MPU(内存保护单元)中将用到的SRAM对应地址的cache禁用,导致FSMC口发送数据和预期不一致。根本原因还是自己对32上一些基础硬件的掌握不够扎实。
2023-05-23 10:53:29
298
原创 SSD中的操作系统--FTL(闪存转换层)
本人萌新一个,下面是自己在学习途中看到的和感悟到的一些东西,如有错误之处或描述不恰当之处,欢迎指出,小生在此谢过各位前辈。因为了解不多,所以不知道对于侵权怎么界定,对于文中涉及到的一些图片和文字,如果涉及到侵权,敬请指出,我会删掉,谢谢。 FTL是一种软件中间层,在度娘上介绍它为:用于将闪存模拟成为虚拟块设备,从而能够在闪存上实现FAT等等块设备类文件系统。要详细了解FTL,有两个名词:LBA...
2018-03-26 17:51:43
6671
转载 C++类型转换符(转载)
C++中新的类型转换符在C语言中,当需要类型转换时只需要强制类型转换就行了,像a = (int)b;但这样的转换不安全,如内存大的类型转换成内存小的类型的时候会丢失一部分、当char型转换为int型时的符号问题。这些问题都无法解决。在C++中,提供了四种更加安全的类型转换符:1、static_cast用法:static_cast (expression)该运算符
2017-05-17 20:52:06
302
原创 c++:引用和指针
1.引用:引用就是为某一变量(目标)取一个别名,对引用的操作与对变量直接操作完全一样。引用的声明方法:类型标识符 &引用名=目标变量名。实质是对变量对应的内存空间另起一个名字,之后通过这两个名字都可对此空间中的内容进行操作。int num = 5;int &p = num;p就是num的引用,num对应的内存空间有了另一个名字p,对p和num操作都是对同一个空间操作
2017-05-16 16:33:04
327
原创 C:关键字,你到C++里就变了
1.const: C语言中,被const关键字修饰的变量变为只读变量,不能通过变量名修改它对应空间的值,但可通过其他途径修改此变量对应空间的值,一般修饰函数形参。在C++中,与C语言有两点不同:1、被它修饰的变量为常量,任何途径都无法修改;2、指针必须是const型对const型,非const型对非const型。 2.static:C语言中,static修饰局部变量、全局变量和函数,被修饰
2017-05-15 10:18:15
292
原创 通过准备国二发现的一些知识点
在准备国二的这几天,刷了一些题库,然后发现自己在基础知识上有很多欠缺,所以把自己遇到的不会和模糊的知识点都整理了下。一、C语言中的实型常量有两种表示形式:1.小数形式,小数形式表示的实型常量必须有小数点,小数点后不必须有数字,如12.是对的;或者是小数点后有数字,小数点前不必须有数字,如.177是对的。2.指数形式,以e或E后跟一个数字来表示以10为底的幂数,且e和E之前必
2017-03-27 16:21:05
1096
原创 单链表的遍历、插入、删除
单链表由一个个的节点组成,节点由两个部分组成:数据域和指针域。数据域就是存储这个节点的数据,这没什么说的。指针域存放的指针指向的是下一个结点,正是因为指针域的存在,把存在内存不连续区域里的各个结点连接了起来。单链表最后一个结点的指针域为空NULL。头结点与头指针的异同:头结点放在第一元素的结点之前,数据域一般无意义或者存放链表的长度,头结点不要求必须存在。
2016-12-05 22:42:51
4156
转载 typedef与define的用法和区别
Typedef和define都可以用来给对象取一个别名,但是两者却有着很大不同。1. 首先,二者执行时间不同关键字typedef在编译阶段有效,由于是在编译阶段,因此typedef有类型检查的功能。Define则是宏定义,发生在预处理阶段,也就是编译之前,它只进行简单而机械的字符串替换,而不进行任何检查。 #define用法例子:#define f(x) x*xmain
2016-11-26 21:58:48
363
原创 使用return注意事项
return不能返回局部变量的地址例:#include char*func(){ char src[100] = "hello world"; return src;}int main(){ char *temp = func(); printf("temp = %s\n",temp); retu
2016-11-25 21:36:53
728
原创 c中的关键字
一、register作用:请求编译器尽可能的将变量存在CPU内部寄存器中,一般的变量存在内存中,当需要时CPU再从内存中把它抓取到CPU中,使用register把它存在CPU中省去了CPU从内存中抓取数据的时间,提高运行效率。注意:1、尽可能,因为CPU内存有限,不可能全放在里面,一般把频繁使用的变量放在里面,如循环变量。 2、register只能修饰局部
2016-11-24 22:01:01
291
原创 共用体、大小端cpu
共用体(union) 共用体的特点:所有变量共用一份空间,空间大小由最大部分所占大小决定。同样遵循字对齐,半字对齐。注意在向共用体中变量赋值时变量间会产生覆盖,如下面的例子#includeunion node{ int num; char ch[2];}; int main(){ node.num =
2016-11-21 22:08:58
574
原创 结构体 内存空洞
结构体作用:封装数据。结构体需要注意的是内存空洞问题如下面的例子:struct node{ char ch; int num; char ch1;};int main(){ struct node p; printf("%d\n",sizeof(p)); return 0;}正常分析输出结果
2016-11-20 21:47:23
863
原创 c语言 调用函数过程
一、调用函数过程1、通过函数名找到入口,函数名是指针常量,保存函数地址。2、给形参分配空间。3、传值:把实参变量对应内存空间的值传递给形参变量对应空间。当只读(只使用不修改)实参变量时,传实参变量名;当写(既使用也修改)实参变量对应内存空间的值时,传实参变量对应空间的地址。fun1(char*num)num++;char*ptr
2016-11-19 22:06:40
891
原创 c语言中的memset函数与bzero函数
上篇文章讲如何避免野指针的时候,其中有个第四步需要清空内存空间,清空内存空间有两个函数可以做到。1、void *memset(void *s, int c, size_t n); 函数解释:将已开辟的内存空间s中前n个字节替换为c并返回s;作用是在一段内存块中填充某个给定的值,它是对较大的结构体或数组进行清零操作的一种最快方法。头文件为string.h。mems
2016-11-18 19:59:47
2349
原创 数组名在做函数形参时的变化
32位系统下void Func ( char str[100] ){ sizeof(str) = ?}void *p = malloc(100);sizeof(p) = ?计算两个sizeof的值答案sizeof(str) = 4sizeof(p) = 4解答: Func(char str[100])中数组名作为函数形参时,在函数体内,数组
2016-11-17 21:48:40
1225
原创 两种编程小技巧
题目:编写程序实现类似hello world到world hello 的变化。核心算法:先把整个语句反转,然后再逐个单词翻转。#include #include#define MAX 100void reverse_word(char*src) // 函数功能翻转单词,遇空格翻转一次{ int len = 0; while(*src != '
2016-11-16 20:49:35
304
原创 malloc ralloc 和 calloc
malloc的调用形式为(类型*)malloc(size),意为在动态存储区中分配1块长度为size的连续区域,返回值为该区域的首地址。calloc的调用形式为(类型*)calloc(n,size),意为在动态存储区分配n块长度为size的连续区域,返回值为该区域首地址。ralloc的调用形式为(类型*)ralloc(*ptr,size),意为将ptr指向的内存空间扩充到size,返回扩充
2016-11-15 17:15:03
402
原创 对指针的基础理解
int num = 5;int *p;p = #p和num的关系如上图所示,p对应的内存空间里保存的是num对应内存空间的地址。如果进行p++操作,得到的是0x1004,因为int型变量是四个字节,如果是num是char型,那p++的结果就是0x1001。这也是步长的概念,对指针加一,跳了多少字节,步长就是多少。如果进行(*p)++操作,得到的就是6。
2016-11-14 19:22:36
685
原创 如何避免“野指针”
野指针是什么?野指针就是未初始化的指针,然后系统会随机一个垃圾值地址,地址可能不可用。野指针的危害:容易造成段错误,即内存泄漏。避免野指针的方法养成良好的编程习惯1.当指针没有指向时把它置为空(NULL)置为空并不是为了解决野指针,只是为了让编程人员在检查错误时可以轻易发现有一个指针没有初始化,继而解决问题。单纯的置为空并没有什么意义。2.像指针指向的内
2016-11-13 22:33:47
644
原创 趣味编程:哥德巴赫猜想
验证:2000以内的正偶数都能分解为两个素数之和。程序:#includemain(){ int i; int n; for(i = 4; i { for(n = 2; n { if(flag(n)) { if(flag(i - n)) {
2016-11-12 18:56:45
1186
原创 与、或和异或在位运算中的应用
一、与 &其功能是参与运算的两个数字对应的二进制位相与。只有对应的两个二进位均为1时,结果位才为1,否则为0。参与运算的数以补码方式出现。按位与运算通常用来对某些位清0或保留某些位。应用:(1)清0特定位(mask中特定位置0,其他位为1,s=s&mask)。(2)取某数中指定位(mask中特定位置1,其他位为0,s=s&mask)。例 利用与将某数的二进制输出
2016-11-10 14:50:06
958
原创 一些错题
1. n进制条件下,567 * 456 = 150216 求n为多少? A. 9 B.10 C.13 D.186 * 7 = 42 ,42除以9和18都余6,所以排除B C。又因为十进制下567 * 456大于150216,所以n大于10,所以选18.2. int a = 5,则++(a++)的值是?答案:编译错误,++是一目运算符,只能用于一个变量,不能同于表达式,而
2016-11-09 20:22:02
302
原创 随笔杂记
当程序变成进程时,系统会给进程分配一个虚拟地址空间,大小为4G,最终映射到物理内存中,内核占1G;剩余3G分为四个部分:栈空间、堆空间、全局数据区、代码段。栈空间
2016-11-08 12:32:10
204
原创 ++i与i++
#includeint main(){ int i = 2; int num; num = (i++)+(i++)+(i++)+(i++); printf(“num = %d,i = %d\n”,num,i);}运行结果:num = 8,i = 6上面程序可等价为:num = i + i + i + i;i++;i++;
2016-11-07 11:35:44
319
原创 scanf函数与printf函数的行缓冲
请看如下程序:#includeint main(){ char ch; int num; printf("Please input num:\n"); scanf("%d",&num); printf("num = %d\n",num); printf("Please input ch:\n"); scanf
2016-11-06 20:28:47
621
原创 企业面试题&&strlen与sizeof的区别
#includeint main(){ char a[1000]; int i; for(i = 0;i { a[i] = -1 - i; } printf("%d",strlen(a)); return 0;}运行结果:255解析:char 型变量占用1个字节8bit,范围为-1
2016-11-05 19:17:53
312
原创 同一个程序不同环境运行结果不同?
#include int main(){ int i; i=1; printf("%d,%d,%d",++i,++i,i); return 0;}gcc编译执行结果为3,3,3.vc运行结果为3,2,1.gcc编译器从右往左读,不过会把printf中的语句一次性读完,先运行两次++i得到i=3,然后输出,这时两个++i就被当作i输出。
2016-11-04 19:47:56
1857
原创 关于函数实参和形参的地址传送
void swap(int a,int b){int i;t = a;a = b;b= t;}int main(){ int i = 5; int j = 6; printf("交换前: i = %d,j = %d\n",i,j); swap(i,j); printf("交换后: i = %d,j = %d\n",i,j); retur
2016-11-02 20:03:38
2800
原创 #include<stdio>与#include"stdio"的区别
"" 尖括号包含的头文件,在查找时去系统头文件目录/usr/include/去找,如果找不到就报错。而 " "" " 双引号包含的头文件是先在当前的工作目录找,再到系统目录去找,如果找不到就报错也就是说,如果你用的是系统自带的函数库,最好用尖括号,这样效率会比较高。
2016-11-01 20:03:18
538
原创 linux系统根目录下各文件夹的作用
/bin 存储二进制可执行文件/dev 设备特殊文件/ etc 系统管理和配置文件/etc/rc.d 启动的配置文件和脚本/home 用户主目录的基点/lib 标准程序设计库,又叫动态连接共享库/sbin 系统管理命令,存放管理员使用的管理程序/tmp 公用的临时文件存储点/root 系统管理员主目录/mnt 让用户临时挂载其他的文件系统/l
2016-11-01 19:56:18
438
原创 c语言编程题 求车速
一辆以固定速度行驶的汽车,司机在上午10点看到里程表(里程表有6位)上的读数是一个对称数95859(即这个数从左向右读和从右向左读是完全一样的)。两小时后里程表上出现了一个新的对称数。问该车的速度是多少?新的对称数是多少?#include"stdio.h"int main(){ int a[5]; int i; int j; int t;
2016-10-31 20:37:15
5489
原创 GDB的基本使用
GDB调试器的使用一般来说,GDB主要帮助你完成下面四个方面的功能: 1、启动你的程序,可以按照你的自定义的要求随心所欲的运行程序。 2、可让被调试的程序在你所指定的调置的断点处停住。(断点可以是条件表达式) 3、当程序被停住时,可以检查此时你的程序中所发生的事。 4、动态的改变你程序的执行环境。
2016-10-30 21:29:58
272
原创 编译过程、动静态库
vim指令以下全是在命令行模式下按shift:然后输入1.?名字 查找2.s/i/j 将i替换为j,只替换第一个 s/i/j/g 将光标所在行整行的i替换为j s/i/j/gc 自己可选择将哪个i换为j 8,9 s/i/j/g 将第八至第九行的替换 %s/i/j/g 全文替换3.!ls 查看当前目录的文件 w 文件1 另存为文件1 3,
2016-10-29 22:09:07
382
原创 歌星大奖赛
实现在比赛中,10个评委打分,去掉最高分与最低分,然后求平均值的一个计算器。实现在比赛中,10个评委打分,去掉最高分与最低分,然后求平均值的一个计算器。实现在比赛中,10个评委打分,去掉最高分与最低分,然后求平均值并输出被去掉的最高分和最低分 。程序:#include"stdio.h "int main(){ int scr,i,ma
2016-10-28 21:51:41
1074
2
原创 本人编程遇到的一些错误解决办法
1.warning: the `gets' function is dangerous and should not be used. 当在vim打开的文件中使用到gets(str),在使用gcc编译时就会出现上面的错误提示。遇到这种情况,可以使用fgets(cmd,100,stdin)来代替gets(str),其中100代表长度。参考于http://blog.sina.com.cn/s/bl
2016-10-28 18:49:56
364
原创 圆,y=x²
圆#include"stdio.h"#include"math.h"main(){ double y; int x,m; for(y=10;y>=-10;y--) { m=2*sqrt(100-y*y); for(x=1;x printf(" ");
2016-10-27 22:33:13
1446
原创 itoa函数的用法
将十进制转换成二进制#include"stdio.h"#include"stdlib.h"main(){int i;char s[128];scanf("%d",&i);itoa(i,s,2);printf("该数转换为二进制为:0%s\n",s);}这段函数里用到了itoa函数,举个例子itoa(m,s,n) 这个语句的意思就是把数字m转换
2016-10-26 14:51:26
3734
原创 一些关于linux的基本代码
linux系统基本指令1.su - A 切换到用户A2.adduser A 添加用户A3.passwd A 为用户A添加密码4.~ 当前用户工作目录5.ls 查看当前文件夹目录下文件6.ls -l 查看当前目录文件的详细信息文件的三种属性r可读 w可写x 可执行7.ls -a 显示以•开头的隐藏文件8.文件类型普通文件 以-开
2016-10-25 12:09:18
346
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人