嵌入式小白学习笔记20180911-0925
20180911
递归函数:一个函数又调用了自身。
图灵定律(自己了解):任何一个可计算的步骤都可以被重复完成
Main函数中不要写static,占用堆空间,且main函数中的值本来就存在于整个函数周期中。
Malloc出的地址,在堆里。
函数向外输出:
1.return输出
2.指针
要是想修改一个变量,务必要传递变量的指针。
指针一定要初始化(否则可能为别的随机值)
Void *func(int a,int *x,void **px)
{
Int b=a+1;
*x=b;
Return 0;
}
Int main(int argc,const char *argv[])
{
Int k = 0;
Func(2,&k,NULL);
Printf(k);
Return 0;
}
将k地址传参
一维指针
Int *m=Null;
取*m地址:&m
二维指针
Int **m=Null;
取**m地址:&m
取任意多次*都是有意义的,但是取1次以上&就无意义。地址永远是一维的,指针可以二维可以多维。
在一维情况下,指针可以和地址相等价。
20180917
Memset():三个入参,第一个是指针,第二个是value,第三个是大小。把一块内存块,设定成值。(可以理解为初始化)
~:取反
!:取非
例:0x02(0000 0010)
取反:0xF(1111 1101)
取非:0
技巧:写true和false时,先定义false,false为0
不要写if(a == 1),要写成if(1 == a)。因为如果只写了一个=,前者不报错,后者会报错。或者写NULL == a
示例:149行错误,153行正确
20180921
Build文件夹:编译器中的内容,若手动编译,不需要这个文件夹
.txt:编译脚本,由Cmake编译系统解释
.kdv4:kde4生成的相关工程文件。若删除,使用kde打开又会重新生成
Cmake:通用的编译生成工具
Cat ./main.cpp:在命令行中显示所有代码。
Nano ./main.cpp:命令行中的文本编辑器。可以直接在命令行中编辑代码
F1-F7:同一时刻7个不同的用户,f7默认是图形化界面
登录使用ctrl+fn+alt+F1
多tty:多个控制台,相互独立,可以登录同一个账号
Vi ./main.cpp:刚进入时,代码是只读模式。按“i”(或是直接按“insert”),即可进入编辑模式。
当操作时,按“esc”,insert消失。然后按“:”,再加“q!”,然后敲回车即可
“vi ./main.c”新建一个文件
“esc”之后,输入“:x”,保存写的文件(若写成大写X,表示文件加密,需要设定密码)
gcc -o test(test为编译的文件名,不是代码的文件名,不需要加后缀)。
gcc -g -o ./test ./main.c生成可编译文件
gdb:
打断点:b main.c:10 //(b表示break,然后是文件名,然后是行号)
然后输入l,回车,即可看到断点那行的代码。
输入r,即可运行,并停在那一行。
单步调试:输入n//(意为next)
直接敲回车:执行上一次的命令,如上一次是n,此次执行的也是n
S:单步进入单步调试
P:display的简写
代码必须要先编译再调试。
关键字:
1.ELF
2.Linux下的多tty操作。
3.开源软件与开源软件的许可证
4.printf的缓冲区和/r/n的关系。
5.valgrind(工具)
6.了解关键字Volatile(后期还会说)(aba问题的解决)
SSL的中间人**
SSL:不对称加密
1.ELF:二进制文件,用于二进制文件、可执行文件、目标代码、共享库和核心转储格式文件。
2.多tty时多用户切换
3.开源软件许可证:
详细参考:http://www.ha97.com/833.html
4.printf和缓冲区及\r\n:
默认情况下,printf()的输出是缓冲的,如果没有换行符,不会立即输出到标准输出。
printf是一个行缓冲函数,先写到缓冲区,满足条件后,才将缓冲区刷到对应文件中,刷缓冲区的条件如下:
1 缓冲区填满
2 写入的字符中有‘\n’ '\r'
3 调用fflush手动刷新缓冲区
4 调用scanf要从缓冲区中读取数据时,也会将缓冲区内的数据刷
满足上面4个条件之一缓冲区就会刷新,,也就是printf会真正调用write来写入。
当我们执行printf的进程或者线程结束的时候会主动调用flush来刷新缓冲区,所以程序结束,也会刷新。
20180925
脚本:
#!/bin/bash
Gcc -o ./test1 ./main.c
权限:文件安全性 使用chmode
Makefile中:
冒号左边为目标,右边为依赖(有的目标为没有依赖的,称之为“伪目标”)。
当有依赖的函数时(个人理解就是有需要调用的函数),在冒号右边加上该函数所在的文件的文件名。
.PHONY:定义多个伪目标
All:普通的脚本目标
-O:优化等级
-O0:优化等级为0,不优化。可以-O1,-O2,-O3(等级不同)。
-g:将调试信息写入可执行程序
关键字:
1.文件的权限问题:
使用ll,显示的结果信息 , 一行是一个目录或者一个文件 , 每行用空格分隔为七列。
第一列是权限信息 : 这部分的类似于 drwxr-xr-x 可以分为四部分 :
第一个字符是表示文件类型 , 可以为以下几种类型:
- 文件 , b 存储设备 (如硬盘) , d 目录 , c 串口设备 (如键盘 , 鼠标) , l 链接文件
剩下的 9 个字符 , 可以平均分为三组 , 每组三个字符,字符由 rwx- 四个字符组成 , 分别代表是否有读取 , 写入 , 执行 , 无任何权限 ;
第一组定义了文件所有者对文件所拥有的权限
第二组为同用户组的用户对文件所拥有的权限
第三组为其他组用户对文件所拥有的权限
修改文件权限的符号类型:
参考资料:https://blog.****.net/zsx157326/article/details/78665960