c

尽量使用#define代替enum 因为枚举常量的标识符与变量和typedef名称属于同一个重载分类。 声明会被覆盖 区分字符型和整型 在进行嵌入式通信编程时,很多人都不搞不清楚字符型和整型之间的区别。 这应该从这两种类型的存储形式和表现形式来区分。 字符型底层存储形式一般是ascii码,一个signed char的正数足够表示所有的ascii字符。 表现形式是单个字符。 整型的底层存储形式一般是补码,大小范围取决于具体的类型和占用的字节数。 表现形式通过printf系函数显示出来。 指针的const使用 const指针有两种方式。 在*之前加const表示指向的值不能变。 在*之后加const表示指针本身不能变。 宏的一些使用 将标识符转为字符串,自动转义和加括号。 1 #define TEST(a, b) printf(#a "<" #b) 标记合并 1 2 #define fun(i) fun ## i // fun(1) 转换为 fun1

January 26, 2021 · 1 min · 阮华锋

terminal color

bashrc 1 2 # terminal color export PS1='[\[\e[01;32m\]\u@\h\[\e[00m\] \[\e[01;34m\]\W\[\e[00m\]]\$ ' 重定向 1 2 cmd $>output.txt cmd |tee file1 |cmd 子shell 1 2 3 # cat files.txt |xargs -I {} cat {} cat files.txt | (while read args; do cat $arg; done) cmd0 |(cd path;cmd1;cmd2) |cmd3 各种命令 seq 0 100返回0到100的整数,分隔符为换行 数值比较用[],字符串比较用[[]] 内建功能 变量 作用 $0 脚本名称 $@ “$1” “$2” “$3” $* “$1c$2c$3” $? 上一个命令退出状态 IFS 分隔符集合 c表示INS的第一个字符 ...

January 17, 2021 · 1 min · 阮华锋

命令

命令 一些常用命令的使用方式和选项 find -name -iname 否定加! find . ! -name '*.txt' -o -a find . \( -name '*.txt' -o '*.png' \) -path find . -path '*/slynux/*' -name '*.txt' -maxdepth -mindepth find -maxdepth 1 -name '*.txt' -L 跟随符号链接 -type 文件类型 -size find . -size +2k -user find . -user slynux 时间戳 -atime 最后一次访问 -mtime 最后一次修改 -ctime 元数据(权限或所有权)最后一次改变 -mmin 分钟 1 2 # 1天前,7天内修改的文件 find . -mtime -7 -mtime +1 xargs 从标准输入中读取数据,转换为另一个命令的参数输入。默认会执行echo指令。 ...

January 17, 2021 · 1 min · 阮华锋

用github的markdown语法

综述 jekyll是一个静态页面生成的框架,功能很强大。一个典型的例子是它的官网和gtk的官网。 但是我在学这东西的时候却感到很头疼,一方面是这个工具是使用ruby的包管理器管理组件,我对ruby是一窍不通。 另一方面是它的官网虽然做得很好看,但是这文档写得也太简陋了,对于没有前端基础的人来说简直一头雾水。 还有一个问题是它标配的主题minima在本地服务器时是正常的,build出来的页面却不正常。连官方主题都是这样,其它的主题也就可想而知了。 包管理的问题可以用fedora的dnf解决,主题的问题干脆学个前端框架算了。就选bootstrap吧,它最多人用。 _config.yml 1 2 3 4 5 6 # 用github的markdown语法 kramdown: input: GFM auto_ids: true hard_wrap: false syntax_highlighter: rouge

January 16, 2021 · 1 min · 阮华锋

键盘映射(cpas与ctrl互换)

键盘映射(cpas与ctrl互换) 由于之前有一段时间学习vim,我已经习惯这种键盘映射。 在不同的系统上有不同的方法。Windows系统需要修改注册表;Linux系统有两种方法修改;Mac系统可以直接在系统设置里调整。 windows系统修改方法 输入regetdit打开注册表,找到对应的项 新建二进制值,重命名为Scancode Map,并修改为下图 **重启电脑后才会生效 Linux系统修改方法:xorg 首先确保系统里有安装xmodmap这个软件,然后在家目录下创建.Xmodmap文件即可。 1 2 3 4 5 6 7 8 9 ! ! Swap Caps_Lock and Control_L ! remove Lock = Caps_Lock remove Control = Control_L keysym Control_L = Caps_Lock keysym Caps_Lock = Control_L add Lock = Caps_Lock add Control = Control_L 一般而言安装xmodmap软件后会附带地安装自动运行脚本,但是也有没安装的情况。这个时候如果重启后不生效,就需要自己写脚本,设置进入桌面时自动启动xmodmap修改映射,在~/.config/autostart/目录下创建modmap.desktop。 ...

January 14, 2021 · 1 min · 阮华锋

gcc

gnu binutils 一种用于二进制文件、可执行文件、目标代码、共享库和核心转储格式文件。是UNIX系统实验室(USL)作为应用程序二进制接口(Application Binary Interface,ABI)而开发和发布的,也是Linux的主要可执行文件格式。 gcc -g 设置为gdb可使用可执行文件 -E 预处理 -S 编译为汇编代码 -c 编译为目标文件 -o 输出的文件名称 gdb l 列出代码 break+行号 设置断点 break+函数 info break 查看断点信息 r 运行程序 n 单步执行 p 输出变量 c 继续运行直到下一个断点 debug 函数运行时间与调用次数 1 2 3 gcc -o test test.c -g -pg ./test # 运行完后会生成gmon.out文件 gprof test # 实现依赖于unix信号量 行计数 1 2 3 gcc -o test test.c -fprofile-arcs -ftest-coverage ./test gcov test # 生成.gcov文件

January 13, 2021 · 1 min · 阮华锋

posix

系统维护 硬盘 1 2 fdisk -l #列出硬盘分区 blkid #查看硬盘id grub2 1 2 3 4 5 6 7 8 9 #记住最后选项 ### 创建虚拟终端 ``` sh socat -d -d PTY PTY sudo vim /etc/default/grub GRUB_DEFAULT=saved GRUB_SAVEDEFAULT=true sudo grub2-mkconfig -o /boot/efi/EFI/fedora/grub.cfg 操作串口 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 #include <sys/types.h> #include <sys/stat.h> #include <fcntl.h> #include <unistd.h> #include <termios.h> #include <stdio.h> int main() { size_t buf_len; char buf[512]; int fd = open("/dev/pts/5", O_RDWR | O_NOCTTY | O_NONBLOCK); if (fd == -1) return -1; struct termios tio; if (tcgetattr(fd, &tio) != 0) return -2; tio.c_cflag |= CLOCAL; // 保证程序不占用串口 tio.c_cflag |= CREAD; // 使能读数据 tio.c_cflag &= ~CRTSCTS; // 不使用流控制 tio.c_cflag &= ~CSIZE; // 屏蔽其它标志位 tio.c_cflag |= CS8; // 8位数据位 tio.c_cflag &= ~PARENB; // 无奇偶校验 tio.c_iflag &= ~INPCK; tio.c_cflag &= ~CSTOPB; // 1位停止位 tio.c_oflag &= ~OPOST; // 原始数据输出 tio.c_lflag &= ~(ICANON | ECHO | ECHOE | ISIG); if (cfsetspeed(&tio, B115200) != 0) return -3; if (tcsetattr(fd, TCSANOW, &tio) != 0) return -4; for (int i = 0; i < 100; ++i) write(fd, "1234", 4); while (1) { printf("ok\n"); if ((buf_len = read(fd, buf, 512)) != -1) { for (int i = 0; i < buf_len; ++i) printf("%c", buf[i]); } sleep(1); } }

January 13, 2021 · 2 min · 阮华锋

正则表达式

综述 由于perl是正则表达式的鼻祖,使用perl语法最为合适。 正则表达式一般用在“三剑客”(grep, sed, awk)和vim中。 要注意的是sed和vim都是行编辑模式。 使用 比如批量重命名文件夹就会用到。 1 for i in *; do echo "$i" |perl -pe 's/(\[.+?\]) *(.+)/\2 \1/'; done greedy 和 lazy 匹配 在* +后添加? 转义字符 . ? + * [] {} / 基本字符类 \d 数字字符 \D 非数字字符 \w [a-zA-Z0-9_] \W [^a-zA-Z0-9_] \s 空白字符 \S POSIX字符类 [:alnum:] [a-zA-Z0-9] [:alpha:] [a-zA-Z] [:xdigit:] [a-fA-F0-9] 边界匹配 \b 单词边界 \B 环视(lookaround) 设置需要匹配不需要获取的部分。 因为lookahead比lookbehind实现更简单,所以lookbehind一般有字符数字的限制,lookahead则没有。 向前查看(lookahead) 肯定式 .+(?=:) 否定式 .+(?!:) 向后查看(lookbehind) 肯定式 (?<=$)[0-9.]+ 否定式 (?<!$)[0-9.]+ 嵌入式条件 (/()?\d{3}(?(1))|-)\d{3}-\d{4} ...

January 13, 2021 · 1 min · 阮华锋

自动保存http帐号密码

设置 1 2 # 自动保存http帐号密码 git config --global credential.helper store 版本控制 git difftool 1234 4321 file -y 比较不同提交差异 git commit --amend 追加提交 log 1 2 3 4 5 6 7 8 git log --since=2.weeks --until=2.days git log --since='2020-05-01' --until='2020-06-01' git log --author=kuang-R # 正则查找提交说明 git log --grep "update" # 查找添加或移除某个特定函数的提交 git log -Sfunction_name # --all-match tag 1 2 3 4 5 6 7 8 git tag -l 'v1.8*' # annotated git tag -a v1.0 -m"my version 1.0" # lightweight git tag v1.0 git push --tags git tag -d v1.o git push origin :refs/tags/v1.0 远程仓库 git remote -v 查看远程仓库 git remote add name url 添加远程仓库 git push name branch -u 设为默认push仓库 .gitignore #开始的行会被忽略 以/开头禁止递归匹配(子目录) 以/结尾表示目录 !取反 ssh 1 2 ssh-keygen -t rsa -C "a1173522112@163.com" cat ~/.ssh/id_rsa.pub

January 13, 2021 · 1 min · 阮华锋

embed

DEBUG 在freerots中断言有两种类型。官网描述 关中断然后进入死循环,使用调试器定位出错位置 进入一个自定义的函数,输出文件名或者文件位置 1 2 3 4 5 6 /* Define configASSERT() to disable interrupts and sit in a loop. */ #define configASSERT( ( x ) ) if( ( x ) == 0 ) { taskDISABLE_INTERRUPTS(); for( ;; ); } /* Define configASSERT() to call vAssertCalled() if the assertion fails. The assertion has failed if the value of the parameter passed into configASSERT() equals zero. */ #define configASSERT( ( x ) ) if( ( x ) == 0 ) vAssertCalled( __FILE__, __LINE__ ) 值得注意的是,cubemx自动生成第一种类型的中断,而且是在USER code中生成的。 这意味着只需要将configASSERT定义为空就可以关掉debug设置,而且不会被新生成的代码覆盖。 ...

January 12, 2021 · 1 min · 阮华锋