高效阅读嵌入式源码系列三:understand阅读经keil MDK编译的源码

系列文章目录

高效阅读嵌入式源码系列一:静态分析神器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脚本语言很关键,解析与应用某些文件也很重要,特别是那些平时我们忽略的某些不起眼的文件,正所谓存在即有用,我们还是要深究下一些底层的东西。

  • 4
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值