系列文章目录
高效阅读嵌入式源码系列一:静态分析神器understand软件基本操作
高效阅读嵌入式源码系列二:understand阅读linux、uboot等源码
高效阅读嵌入式源码系列三:understand阅读经keil MDK编译的源码
文章目录
一、前言
在嵌入式源码阅读中,除linux、uboot外还有很多工程,像工程比较复杂的有rt-thread源码,又该如何精准的找到工程中所必须的源文件与头文件了。
这里需要用到 鱼鹰Qsprey 大神写的脚本工具了,可以精准的收集所有Keil MDK源代码文件:如何精准的收集所有 MDK 源代码文件?一个脚本搞定。
本文是介绍鱼鹰Qsprey大神的脚本工具以及与understand软件的结合使用。
提示:以下是本篇文章正文内容,下面案例可供参考
二、脚本工具是什么?
这个脚本,是将Keil MDK 工程里面包含的文件提出来,方便understand或source insight软件导入使用。
这个脚本会在当前目录下生成两个文件,absolute_files.txt和relative_files.txt,里面包含了两种路径信息,如果使用相对路径的话,可以使用relative_files.txt导入到understand工程中。
三、使用步骤
0. 编译Keil MDK ,产生 *.d 文件
使用keil mdk编译,这里不多说,从事嵌入式开发的各位同仁,基本都懂。
1. 将脚本保存在某个文件中,如 mdk_list.sh
鱼鹰Qsprey大神写的脚本如下:
注意:这个脚本须在git bash中执行,便可完成提取工作(包括汇编文件、C源文件、C头文件等)。
#!/bin/bash
# Author: Osprey
# 本脚本用于生成 MDK 包含的源文件信息
# 必须使用 MDK 编译后,在工程文件目录下执行本脚本
dir_obj=./obj # *.d 文件所在目录
out_file_name=absolute_files.txt # 输出文件名(绝对路径)
relative_out_file_name=relative_files.txt # 输出文件名(相对路径)
###当前路径处理
# 斜杠替换为反斜杠 \ 也是特殊字符,需要转义 操作 `` 有问题
curr_dir=`pwd`/
echo ${curr_dir} | sed 's/\//\\/g' > ${out_file_name} && curr_dir=`cat ${out_file_name}`
curr_dir=${curr_dir#*\\} # 去除第一个斜杠
# 第一个反斜杠替换 :\
echo ${curr_dir} | sed 's/\\/:\\/' > ${out_file_name} && curr_dir=`cat ${out_file_name}`
# 替换 \ 为 \\ 防止 sed 命令出错
echo ${curr_dir} | sed 's/\\/\\\\/g' > ${out_file_name} && curr_dir=`cat ${out_file_name}`
echo "curr dir: ${curr_dir}"
# *.d 文件中包含了源文件信息所以不需要从 *.uvoptx 中提取,下面这些 if 里面的命令没有意义
if false ; then
dir_uvoptx=./
file_uvoptx=`find ${dir_uvoptx} -name "*.uvoptx"`
echo "file the name: ${file_uvoptx}"
sed -i "s/ <PathWithFileName>/"${curr_dir}"/g" ${out_file_name}
sed -i 's/<\/PathWithFileName>//g' ${out_file_name}
fi
# 首先进入目录
cd ${dir_obj}
temp_file_name=temp_files.txt
find ./ -name "*.d" | xargs cat > head_temp.txt # 合并所有 d 文件
if [[ ! -s head_temp.txt ]]
then
echo "file is null, please build the project" # 文件空白
exit 0
fi
# 去除重复文件,并排序
sort -u head_temp.txt > head_temp1.txt
# 去除标准头文件 搜索关键 ':\' (包含了标准头文件),分隔符 ':' 去除 *.O 文件名 'o: ..' 'o: \.\.'
cat head_temp1.txt | grep -v ':\\' | awk -F ": " '{print $2}' > head_temp.txt
# 替换 / 为 \
sed -i 's/\//\\/g' head_temp.txt
# 添加绝对路径
absolute_files=../${out_file_name}
echo "add absolute dir: ${curr_dir}" # 双反斜杠是为了防止 sed 命令出错
#行首(^ 代表行首)添加绝对路径字符串
sed "s/^/"${curr_dir}"/g" head_temp.txt > ${absolute_files}
# 添加相对路径(去除 ..\ )必须用单引号(根据 SI 工程的情况决定是否去除 ..\)
relative_files=../${relative_out_file_name}
sed 's:\.\.\\::g' head_temp.txt > ${relative_files}
rm head_temp.txt head_temp1.txt # 删除文件
cnt=`wc ${absolute_files} | awk '{print $2}'` # 计文件数
echo "all files is saved in file: ${absolute_files##*/} && ${relative_files##*/}, files number is: ${cnt} "
2. 将脚本复制到工程目录下
这里以开源库EasyFlash为例,如下:
同时,修改脚本的 *.d 文件夹路径,这里的路径为 Output,
3. 打开 git bash
4.执行刚才的脚本,可以在脚本目录下生成两个文件
./mdk_list.sh
示例如:
5. 可以打开文件查看信息:
绝对路径
相对路径:
6. 利用生成的absolute_files.txt,将文件导入到understand。
具体导入方法在前面的系列文章说得很详细了,各位看官可去翻看下之前的文章,就知道怎么导入到understand.
当然,熟悉source insight的同仁,也可将此txt文件使用至source insight工程。
四、总结
以上是简略介绍了鱼鹰Osprey大神的脚本工具,更为基础的原理大家可去他的公众号文章仔细阅读:如何精准的收集所有 MDK 源代码文件?一个脚本搞定。再次非常感谢鱼鹰大神提供这么好用的工具给我们。
题外话:
从本系列文章来看,理解与应用shell脚本语言很关键,解析与应用某些文件也很重要,特别是那些平时我们忽略的某些不起眼的文件,正所谓存在即有用,我们还是要深究下一些底层的东西。