Matrix

CarlyleLiu‘s Blog

内存使用情况分析

DRAM 大小

硬件上 DDR 确定之后, DRAM 大小就已经确定。

uboot 会根据 DRAM 驱动提供的接口获取 DRAM 的大小,然后修改 dts 中的 memory 节点,Linux 启动时解析 dts 获取 DRAM 的大小。 uboot 启动 log 中会打印 dram 的大小。比如 R329 方案 uboot 启动时会有如下 log:

1
[01.300]DRAM: 128 MiB

执行:

1
2
3
root@TinaLinux:/# hexdump -C /sys/firmware/devicetree/base/memory@40000000/reg
00000000 00 00 00 00 40 00 00 00 00 00 00 00 08 00 00 00 |....@...........|
00000010

也可以获取 dram 的起始地址与大小。如下面 R329 例子所示,其中 0x40000000 为起始地址, 0x08000000 为 dram 的 size.

阅读全文 »

cpu 使用分析

top 命令

1
procps-ng-top -H -p 899 -w 120
  • -H 是线程模式
  • -p 指定进程 id
  • -w 指定显示宽度(列数)
  • -d 指定延时 ,屏幕更新间隔

shift+p 按照 cpu 使用率对线程排序。如下是一个实例:

阅读全文 »

概述

LeakTracer 是在检查 C++ 程序内存泄漏时编写的一个小工具。我无法让 dmalloc 显示我想要的内容,我只看到了提到的 __builtin_return_address gcc-extension。

要使用 LeakTracer,请使用提供的 LeakCheck 脚本运行您的程序。它使用 LD_PRELOAD 特性在你的函数之上“覆盖”一些函数(不需要重新编译)。如果您的平台不支持 LD_PRELOAD,您可以将 LeakTracer.o 对象文件添加到 Makefile 中的对象并运行您的应用程序。

LeakTracer 利用 gdb 去输出发生内存泄露所发生的位置,它是通过 override operator new, operator delete, operator malloc, operator free 来实现检测。

阅读全文 »

安装

ros 安装

设置 sources.list:

1
sudo sh -c 'echo "deb <http://packages.ros.org/ros/ubuntu> $(lsb_release -sc) main" > /etc/apt/sources.list.d/ros-latest.list'

设置 keys:

1
sudo apt-key adv --keyserver 'hkp://keyserver.ubuntu.com:80' --recv-key C1CF6E31E6BADE8868B172B4F42ED6FBAB17C654

安装:

1
2
sudo apt-get update
sudo apt-get install ros-kinetic-desktop-full

设置环境:

1
2
3
4
5
echo "source /opt/ros/kinetic/setup.bash" >> ~/.bashrc
source ~/.bashrc
or
echo "source /opt/ros/kinetic/setup.zsh" >> ~/.zshrc
source ~/.zshrc

安装依赖:

1
sudo apt install python-rosdep python-rosinstall python-rosinstall-generator python-wstool build-essential

初始化 rosdep:

1
2
3
sudo apt install python-rosdep
sudo rosdep init
rosdep update
阅读全文 »

合并文件

1
ffmpeg -i "concat:file_name1.ts | file_name2.ts" -c copy_out.ts

在视频文件中提取图片

1
ffmpeg -i output.ts '%d.png'
阅读全文 »

Makefile 规则

一个简单的 Makefile 文件包含一系列的“规则”,其样式如下:

1
目标 (target)…: 依赖 (prerequiries)…<tab>命令 (command)
  • 目标 (target) 通常是要生成的文件的名称,可以是可执行文件或 OBJ 文件,也可以是一个执行的动作名称,诸如`clean’。
  • 依赖是用来产生目标的材料(比如源文件),一个目标经常有几个依赖。
  • 命令是生成目标时执行的动作,一个规则可以含有几个命令,每个命令占一行。 注意:每个命令行前面必须是一个 Tab 字符,即命令行第一个字符是 Tab。

通常,如果一个依赖发生了变化,就需要规则调用命令以更新或创建目标。但是并非所有的目标都有依赖,例如,目标“clern”的作用是清除文件,它没有依赖。 规则一般是用于解释怎样和何时重建目标。

make 首先调用命令处理依赖,进而才能创建或更新目标。当然,一个规则也可以是用于解释怎样和何时执行一个动作,即打印提示信息。一个 Makefile 文件可以包含规则以外的其他文本,但一个简单的 Makefile 文件仅仅需要包含规则。虽然真正的规则比这里展示的例子复杂,但格式是完全一样的。

对于上面的 Makefile,执行“make”命令时,仅当 hello.c 文件比 hello 文件新时才会执行命令“arm-linux-gcc –o hello hello.c”生成可执行文件 hello;如果还没有 hello 文件,这个命令也会执行。 运行“make clean”时,由于目标 clean 没有依赖,它的命令“rm -f hello”将被强制执行。

阅读全文 »

gcc 编译流程

一个 C/C++文件要经过预处理 (preprocessing)、编译 (compilation)、汇编 (assembly) 和链接 (linking) 等 4 步才能变成可执行文件。

预处理

C/C++源文件中,以“#”开头的命令被称为预处理命令,如包含命令“#include”、宏定义命令“#define”、条件编译命令“#if”、“#ifdef”等。预处理就是将要包含 (include) 的文件插入原文件中、将宏定义展开、根据条件编译命令选择要使用的代码,最后将这些东西输出到一个“.i”文件中等待进一步处理。

编译

编译就是把 C/C++代码(比如上述的“.i”文件)“翻译”成汇编代码,所用到的工具为 cc1(它的名字就是 cc1,x86 有自己的 cc1 命令,ARM 板也有自己的 cc1 命令)。

汇编

汇编就是将第二步输出的汇编代码翻译成符合一定格式的机器代码,在 Linux 系统上一般表现为 ELF 目标文件 (OBJ 文件),用到的工具为 as。x86 有自己的 as 命令,ARM 版也有自己的 as 命令,也可能是 xxxx-as(比如 arm-linux-as)。

链接

链接就是将上步生成的 OBJ 文件和系统库的 OBJ 文件、库文件链接起来,最终生成了可以在特定平台运行的可执行文件,用到的工具为 ld 或 collect2。

编译程序时,加上-v 选项就可以看到这几个步骤

阅读全文 »

常用

git 与上游 保持同步

1
2
3
git remote add src-zephyr <https://github.com/zephyrproject-rtos/zephyr>
git pull src-zephyr master
git push

git 合并分支

1
2
3
git revert
git pull --rebase origin
git pull --rebase origin release-v1.0

如果有冲突:

1
2
3
git status # 查看冲突文件并解决冲突
git add # 提交解决冲突后的文件
git rebase --continue # 完成
阅读全文 »
0%