<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>StrongWong</title><link>http://blog.strongwong.top/</link><description>Recent content on StrongWong</description><generator>Hugo -- gohugo.io</generator><language>en</language><copyright>Copyright © 2018–2023, BH6BAO; all rights reserved.</copyright><lastBuildDate>Sat, 20 Mar 2021 00:00:00 +0000</lastBuildDate><atom:link href="http://blog.strongwong.top/index.xml" rel="self" type="application/rss+xml"/><item><title>什么是超低功耗基准测试——ULPMark Benchmark</title><link>http://blog.strongwong.top/post/%E4%BB%80%E4%B9%88%E6%98%AF%E8%B6%85%E4%BD%8E%E5%8A%9F%E8%80%97%E5%9F%BA%E5%87%86%E6%B5%8B%E8%AF%95ulpmark-benchmark/</link><pubDate>Sat, 20 Mar 2021 00:00:00 +0000</pubDate><guid>http://blog.strongwong.top/post/%E4%BB%80%E4%B9%88%E6%98%AF%E8%B6%85%E4%BD%8E%E5%8A%9F%E8%80%97%E5%9F%BA%E5%87%86%E6%B5%8B%E8%AF%95ulpmark-benchmark/</guid><description>0x00 前言 说起嵌入式领域的一些基准测试，大家可能更了解的是 Coremark Benchmark，也就是大家常说的 CPU (中央处理器)性能基准测试。ULPMark Benchmark 也和 Coremark 类似，ULPMark 即“Ultra-Low Power Mark” 超低功耗评分；二者都是由 EEMBC (嵌入式微处理器基准测试联盟)开发的一套用 C 语言编写的、易于移植的标准测试程序。略有不同的是 Coremark 是专门为测试处理器核心性能而设计的，而 ULPMark 是为了评价一款 MCU 的低功耗性能而设计的。在嵌入式领域中对一款芯片的评价一般来说都会非常关心两个指标，一个就是性能，另一个就是功耗。所以性能就看 Coremark 评分，低功耗就看 ULPMark 评分。Coremark 网上资料有很多，这里我就不做过多介绍了，那么低功耗性能测试为什么是 ULPMark 呢？
0x01 为什么低功耗 MCU 测评采用 ULPMark 首先，ULPMark 的测试代码与 Coremark 一样，几乎是一套与硬件无关的算法，是一套很标准化的测试，在不同的厂商的不同处理器上都可以运行，且使用相同的电流测试板记录电流数据，所以说大家几乎都是在相同的平台下进行测试的，这样在不同的处理器之间就具有可比性。 第二，所有人发布的测试评分提交给 EEMBC 组织时，都需要提供完整的操作流程说明，及测试代码包括测 bin 文件。所以在 EEMBC 官网上可以看到的评分(尤其是 EEMBC check 过，打勾的评分)，你拿对应被测件，按照发布的流程使用对应的 bin 文件，你几乎都可以复现出厂商在 EEMBC 上发布的评分。 其次，著名的低功耗芯片厂商几乎都在使用 ULPMark 作为测试标准，包括 Ambiq、Analog、TI、Renesas、ST、On Semi、NXP 等著名的嵌入式芯片厂商。 最后， EEMBC 也是一个很可靠的组织，他们致力于开发基准测试，他们发布过很多的基准测试，广泛应用于电信、网络、汽车电子、消费电子等领域。
那么 ULPMark 怎么测，都测些什么呢？
0x02 ULPMark 测试有什么 ULPMark 测试目前有三个部分，分别是 ULPMark-CoreProfile、ULPMark-PeripheralProfile 和 ULPMark-CoreMark。</description></item><item><title>浅谈 RISC-V 软件开发生态之 IDE</title><link>http://blog.strongwong.top/post/%E6%B5%85%E8%B0%88-risc-v-%E8%BD%AF%E4%BB%B6%E5%BC%80%E5%8F%91%E7%94%9F%E6%80%81%E4%B9%8B-ide/</link><pubDate>Fri, 12 Feb 2021 00:00:00 +0000</pubDate><guid>http://blog.strongwong.top/post/%E6%B5%85%E8%B0%88-risc-v-%E8%BD%AF%E4%BB%B6%E5%BC%80%E5%8F%91%E7%94%9F%E6%80%81%E4%B9%8B-ide/</guid><description>0x00 前言 今天简单谈一些关于 RISC-V 开发的软件生态相关，主要是关于 RISC-V 的开发 IDE，就是集成开发环境。集成开发环境（IDE，Integrated Development Environment ）是用于提供程序开发环境的应用程序，一般包括代码编辑器、编译器、调试器和图形用户界面等工具。集成了代码编写功能、分析功能、编译功能、调试功能等一体化的软件开发服务套（组）。
目前来看，RISC-V 的硬件生态已经在蓬勃发展，而 RISC-V 相关的软件生态还在日趋完善的过程中，这里就来浅谈一点我的个人认识，如有不对，请批评指正。
目前，RISC-V 的软件开发 IDE ，主要是有以下几种解决方案。
0x01 eclipse —— 著名开源 IDE 全开源，需要自行集成 RISC-V Toolchains + eclipse + OpenOCD 来搭建开发环境。
优点：
全开源，自由，免费 的 IDE 有众多公司厂商，组织，支持维护 可扩展的插件功能 缺点： 庞大臃肿，而且需要 java 运行环境。现在的版本在安装过程中会自动安装一个 jre 的运行环境。但是目前国内用户如果自行安装会下载很慢，使用代理相对快很多。如果不使用安装版本，也可以使用 zip 包解压的版本 集成众多插件，插件数量多了之后会拖慢系统 需要自行集成编译器及仿真器，打包发布给用户使用 0x02 IAR for RISC-V—— 老牌商业 IDE IAR for RISC-V 版本目前已经正在和部分芯片厂商进行合作适配、授权支持。主要包括：SiFive、Andes Technology、Nuclei（芯来科技）、CloudBEAR、Syntacore、C-SKY（平头哥）、GigaDevice（兆易创新）、MicroChip。
优点：
IAR 有非常优秀的编译器，针对代码的大小和速度有很好的优化；从 coremark 跑分排行榜上的 ARM 芯片来看，相对来说 IAR 的代码性能更高一些，当然各版本之间也会存在差异。但目前 IAR for RISC-V 的版本还未开放下载，暂时还没有相关测评。 有很优秀的 Trace 工具进行调试 缺点：</description></item><item><title>简单了解一下小米 vela</title><link>http://blog.strongwong.top/post/%E7%AE%80%E5%8D%95%E4%BA%86%E8%A7%A3%E4%B8%80%E4%B8%8B%E5%B0%8F%E7%B1%B3-vela/</link><pubDate>Tue, 12 Jan 2021 00:00:00 +0000</pubDate><guid>http://blog.strongwong.top/post/%E7%AE%80%E5%8D%95%E4%BA%86%E8%A7%A3%E4%B8%80%E4%B8%8B%E5%B0%8F%E7%B1%B3-vela/</guid><description>0x00 小米 vela 前段时间小米推出了 vela 物联网平台，vela 就是基于 NuttX 打造的物联网开发平台。
小米对 NuttX 的评价：
NuttX 对 POSIX 标准有原生兼容：NuttX 是可商用化 RTOS 中唯一一个对 POSIX API 有原生支持的实时操作系统，所以很多 Linux 社区的开源软件可以很方便的移植到 NuttX 上，这样可以极大的简化开源软件移植，方便代码复用，降低学习曲线，其它 RTOS 需要适配层把 POSIX API 转成内部 API，而且通常只兼容一小部分的 POSIX 接口。 完成度高：NuttX 集成了文件系统、网络协议栈、图形库和驱动框架，减少开发成本。 模块化设计：所有组件甚至组件内部特性，都可以通过配置 Kconfig 来调整或关闭，可按需对系统进行裁剪，适用于不同产品形态。 代码精简：所有组件都是从头编码，专门对代码和数据做了优化设计。 轻量级：虽然 NuttX 实现了传统操作系统的所有功能，但是最终生成的代码尺寸还是可以很小（最小配置不到 32KB，最大配置不超过 256KB）。 和 Linux 系统的兼容性：因为 NuttX 整体设计、代码组织，编译过程和 Linux 非常接近，将会极大地降低 Android/Linux 开发者的迁移成本。 活跃开放的社区：很多厂商（比如小米、Sony，乐鑫、NXP 等）和开源爱好者都在积极回馈社区。 不难看出小米对 NuttX 的评价很不错。所以我也来赶紧学习一波，做了一个简单的了解，作为自己的技术储备。
0x01 安装配置 环境： Ubuntu20.04 系统、ARM GUN 2019q4 版本 gcc、openocd 0.10 版本</description></item><item><title>wujian100 的 PWM 周期问题</title><link>http://blog.strongwong.top/post/wujian100-%E7%9A%84-pwm-%E5%91%A8%E6%9C%9F%E9%97%AE%E9%A2%98/</link><pubDate>Sun, 02 Aug 2020 00:00:00 +0000</pubDate><guid>http://blog.strongwong.top/post/wujian100-%E7%9A%84-pwm-%E5%91%A8%E6%9C%9F%E9%97%AE%E9%A2%98/</guid><description>PWM 波形发生器实验结果 在 wujian100 的样例程序代码如下：
int32_t pwm_signal_test(uint32_t pwm_idx, uint8_t pwm_ch) { int32_t ret; pwm_handle_t pwm_handle; example_pin_pwm_init(); pwm_handle = csi_pwm_initialize(pwm_idx); if (pwm_handle == NULL) { printf(&amp;#34;csi_pwm_initialize error\n&amp;#34;); return -1; } ret = csi_pwm_config(pwm_handle, pwm_ch, 3000, 1500); //设置pwm周期3ms if (ret &amp;lt; 0) { printf(&amp;#34;csi_pwm_config error\n&amp;#34;); return -1; } csi_pwm_start(pwm_handle, pwm_ch); mdelay(20); ret = csi_pwm_config(pwm_handle, pwm_ch, 200, 150); //设置pwm周期200us if (ret &amp;lt; 0) { printf(&amp;#34;csi_pwm_config error\n&amp;#34;); return -1; } mdelay(20); csi_pwm_stop(pwm_handle, pwm_ch); csi_pwm_uninitialize(pwm_handle); return 0; } 其中有两句配置函数</description></item><item><title>用 Kindle 做树莓派的显示屏</title><link>http://blog.strongwong.top/post/%E7%94%A8-kindle-%E5%81%9A%E6%A0%91%E8%8E%93%E6%B4%BE%E7%9A%84%E6%98%BE%E7%A4%BA%E5%B1%8F/</link><pubDate>Sun, 24 May 2020 00:00:00 +0000</pubDate><guid>http://blog.strongwong.top/post/%E7%94%A8-kindle-%E5%81%9A%E6%A0%91%E8%8E%93%E6%B4%BE%E7%9A%84%E6%98%BE%E7%A4%BA%E5%B1%8F/</guid><description>一、工具 树莓派3b 一台 Kindle PaperWhite 1 一台 无线键鼠一套 无线路由器 or USB 数据线 二、Kindle 越狱 首先，按照网上的教程把 Kindle 越狱。但是我手上这台 kindle 是 5.6.1.1 的最高版本了。不能直接越狱，需要先把其刷机，强行固件降级到 5.4.4 版本才能越狱。越狱前注意事项，建议遵守：
确认 Kindle 已绑定亚马逊账号； 确认 Kindle 电量处于充满状态； 确认 Kindle 的特惠广告已关闭； 确认 Kindle 已停用 设备密码和家长监护设置； 确认 Kindle 已开启飞行模式处于离线状态。 2.1 固件降级 如果你的 KPW1 也和我一样是高于 5.4.4 的版本，需要先把固件降级到 5.4.4。可以前往书伴的 『固件大全』 下载 5.4.4 版本固件，然后把 Kindle 连接到电脑直到出现 Kindle 磁盘。把下载到的固件文件 update_kindle_5.4.4.bin 放到 Kindle 的根目录。不要拔出数据线，直接长按电源键直到开始更新。 没有问题继续下一步。
2.2 开始越狱 下载越狱文件『kindle-jailbreak-1.14.N.zip』。解压得到压缩包 kindle-5.4-jailbreak.zip，将其再次解压，得到一个名为 kindle-5.4-jailbreak 的文件夹。文件夹内有如下所示七个文件：
bridge.conf bridge.sh developer.keystore gandalf jb.</description></item><item><title>关于 RISC-V 架构下 RTOS 的一些知识</title><link>http://blog.strongwong.top/post/%E5%85%B3%E4%BA%8E-risc-v-%E6%9E%B6%E6%9E%84%E4%B8%8B-rtos-%E7%9A%84%E4%B8%80%E4%BA%9B%E7%9F%A5%E8%AF%86/</link><pubDate>Tue, 07 Apr 2020 00:00:00 +0000</pubDate><guid>http://blog.strongwong.top/post/%E5%85%B3%E4%BA%8E-risc-v-%E6%9E%B6%E6%9E%84%E4%B8%8B-rtos-%E7%9A%84%E4%B8%80%E4%BA%9B%E7%9F%A5%E8%AF%86/</guid><description>0x00 之前的 blog 有介绍了一些，wujian100 的一些知识，包括综合、测试等。最近就想在 wujian100 上看看能不能移植一下比较常见的一些 RTOS (Real Time Operating System,实时操作系统)上去试试，比如 Free RTOS、RT-Thread等。结果发现这里还是有一些坑的。虽然 FreeRTOS 和 RTT 都支持 RISC-V 的芯片了，但是 wujian100 这个是 RISC-V “E” 基础架构，也就是 RV32E 就是 标准嵌入式扩展 指令集（这个版本降低了核心的开销，CPU 寄存器裁剪了一半，为 16 个）。但是 FreeRTOS 和 RTT 目前支持的版本都是 32 个寄存器的，对于任务或者说线程的上下文切换时对栈帧的操作还是有一些差异。然后呢也想对比一下 ARM 架构和 RISC-V 架构下嵌入式实时操作系统处理的一些区别，这里呢就想做一些的简单记录。
ARM 和 RISC-V 架构的区别 由于我是先学的 ARM 也相对了解一些，所以做什么总是想拿来和 ARM 对比一下，看看能不能套在 ARM 上，这也对自己理解也有一些帮助。缺点就是会产生一些先入为主的观念。
一个最简单的 RTOS 应该至少要实现一个多任务管理的功能，所以 RTOS 也可以叫实时多任务操作系统。那么一个简单的 RTOS 的核心就是怎么处理多任务或者说多线程之间的切换，这里我们也叫做上下文切换，所以上下文切换机制的实现就非常重要，这就要牵扯到不同架构的 CPU 会有不同的处理方式。
ARM 架构下 RTOS 的一般处理过程 这里以 Cortex-M3 为例，在 ARM 架构中有一组 特殊功能寄存器组，很多时候就是专门留给 OS 使用的。其中由 CONTROL[0:1] 寄存器来定义 CPU 的特权等级。这里就要提到在 ARM 架构中的双堆栈机制，在 CM3 内核中支持两个堆栈，一个是 MSP（主堆栈指针）指向的主堆栈和 PSP（线程堆栈指针）指向的线程堆栈。通过配置 CONTROL 寄存器的两个位来选择特权级别和使用不同的堆栈指针（还有一个骚操作就是从异常返回时修改 LR 的 bit1 和 bit2 也可以切换模式和堆栈，我们可以在很多开源的 RTOS 中见到）。这样通过这两个寄存器的配置就可以分开对待用户程序和系统程序，避免因用户级程序的问题对系统造成危害。同时在出入异常处理时这两个堆栈指针是通过硬件自动切换的，对于现场的保存就不需要软件来处理了。而且在 Handler 或者说异常中只能使用 MSP（主堆栈指针）。</description></item><item><title>使用 vivado 综合 wujian100 生成 bitstream 文件</title><link>http://blog.strongwong.top/post/%E4%BD%BF%E7%94%A8-vivado-%E7%BB%BC%E5%90%88-wujian100-%E7%94%9F%E6%88%90-bitstream-%E6%96%87%E4%BB%B6/</link><pubDate>Sun, 24 Nov 2019 00:00:00 +0000</pubDate><guid>http://blog.strongwong.top/post/%E4%BD%BF%E7%94%A8-vivado-%E7%BB%BC%E5%90%88-wujian100-%E7%94%9F%E6%88%90-bitstream-%E6%96%87%E4%BB%B6/</guid><description>综合环境 上一篇 blog 呢，我记录一下运行 wujian100 的一些仿真过程，这篇 blog 我将简单介绍一下使用 vivado 来综合 wujian100 需要注意的一些地方。
首先，说明一下我的综合环境，我是在 WSL 下安装的 vivado 2018.3 版本，然后是完全 vivado 环境下综合生成 bitstream 文件，因为没有安装 synplify，所以就没有使用官方推荐的 synplify 进行综合。
系统：Windows 10 ， WSL Ubuntu 18.04
软件: vivado 2018.3
安装 vivado 首先，你如果没有安装 vivado 就先安装一下 vivado，在命令行下自己运行 ./xsetup 即可，安装完成后记得设置一下环境变量，具体的安装方法，我这里就不做详细介绍了，请自行搜索。
$ ./xsetup 打开 vivado 新建工程 接下来，我们进入到 wujian100_open 的 fpga-&amp;gt;vivado 目录下，在命令行下输入 vivado ，启动 vivado。
$ vivado vivado 启动完成之后，我们来创建应该新工程，点击 Create project ，Next-&amp;gt;填写工程名称，Next-&amp;gt; 选择 RTL Project，Next-&amp;gt; 选择 wujian100 这个开发板对应的 FPGA 型号 xc7a200tfbg484-1，最后 Finish 即可，工程创建结束。</description></item><item><title>Windows 下学习阿里平头哥 RISC-V 芯片开发平台 wujian100</title><link>http://blog.strongwong.top/post/windows-%E4%B8%8B%E5%AD%A6%E4%B9%A0%E9%98%BF%E9%87%8C%E5%B9%B3%E5%A4%B4%E5%93%A5-risc-v-%E8%8A%AF%E7%89%87%E5%BC%80%E5%8F%91%E5%B9%B3%E5%8F%B0-wujian100/</link><pubDate>Sat, 09 Nov 2019 14:59:55 +0000</pubDate><guid>http://blog.strongwong.top/post/windows-%E4%B8%8B%E5%AD%A6%E4%B9%A0%E9%98%BF%E9%87%8C%E5%B9%B3%E5%A4%B4%E5%93%A5-risc-v-%E8%8A%AF%E7%89%87%E5%BC%80%E5%8F%91%E5%B9%B3%E5%8F%B0-wujian100/</guid><description>前言 上个月，在第六届互联网大会上，阿里的平头哥，对，就是那个人狠话不多的公司！他们宣布开源了 wujian100 这个芯片设计平台。搭载基于 RISC-V 架构的玄铁 902 处理器。 基础硬件代码和配套软件代码发布在了 GitHub 上了，使用的是 MIT 许可证。大家也都可以去下载学习。
GitHub 链接：https://github.com/T-head-Semi/wujian100_open
介绍视频 https://www.bilibili.com/video/av74527234
搭建仿真环境 安装 Linux 环境 我们要去学习 wujian100 这个代码，首先要去搭建一下运行仿真的环境。跑无剑这个仿真是需要 Linux 环境的，所以我就安装了 WSL（ Windows subsystem of Linux），我这里呢安装了 Ubuntu 18.04 的版本。要安装 WSL ，首先要去 控制面板-&amp;gt;程序-&amp;gt;启用或关闭 Windows 功能 勾选开启 适用于 Linux 的 Windows 子系统 这个选项，这样你就可以去微软应用商店正常安装 Linux 子系统了。
安装好子系统之后，我们直接进入到子系统下面进行操作就可以了。
新建目录 Clone 官方代码 首先我们按照官方在 GitHub 上的教程新建一个项目目录，然后进入到目录， clone 官方发布的代码。
$ mkdir test_prj $ cd test_prj $ git clone https://github.com/T-head-Semi/wujian100_open.git 安装 RISC-V 工具链 接下来，新建工具链目录，去官方给定的地址下载编译代码需要的 risc-v 工具链，解开压缩包，找到 riscv64-elf-x86_64-20190731.</description></item><item><title>FPGA 数字图像处理联合仿真平台的搭建及使用举例</title><link>http://blog.strongwong.top/post/fpga-%E6%95%B0%E5%AD%97%E5%9B%BE%E5%83%8F%E5%A4%84%E7%90%86%E8%81%94%E5%90%88%E4%BB%BF%E7%9C%9F%E5%B9%B3%E5%8F%B0%E7%9A%84%E6%90%AD%E5%BB%BA%E5%8F%8A%E4%BD%BF%E7%94%A8%E4%B8%BE%E4%BE%8B/</link><pubDate>Mon, 02 Sep 2019 21:25:33 +0000</pubDate><guid>http://blog.strongwong.top/post/fpga-%E6%95%B0%E5%AD%97%E5%9B%BE%E5%83%8F%E5%A4%84%E7%90%86%E8%81%94%E5%90%88%E4%BB%BF%E7%9C%9F%E5%B9%B3%E5%8F%B0%E7%9A%84%E6%90%AD%E5%BB%BA%E5%8F%8A%E4%BD%BF%E7%94%A8%E4%B8%BE%E4%BE%8B/</guid><description>前言 随着物联网技术的不断发展，对边缘计算的性能要求愈发苛刻，传统的 IoT 级别的 SoC 或者 MCU 难以应对诸如图像识别的场景需求，因此 FPGA + MCU 或 FPGA + SoC 的异构架构愈来愈多地应用于上述场景中，以满足相关需求。（以上这段话毫无意义，只是为了凑字数，另外为了纪念第三次憾负的开场白）
当前 FPGA 发展火热，众多开发者使用 FPGA 来完成部分图像处理的部分功能，但众所周知纯 FPGA 开发（或者数字 IC 设计）与常见的 ARM A 系列（with OS）或者桌面端 PC 在图像处理开发过程中最大的差别在于过程的可视化。开发过程中的可视化多少会影响到开发者对于图像处理的判断与取舍，简而言之，如果开发者都不知道经过了这一步处理后图像变成了什么样，那还如何继续接下来的步骤。因此分享交流一下在本次车牌识别设计中我们所用到的数字图像处理的联合仿真平台（注：本文仅仅介绍平台使用方式，不介绍过程中涉及到的数字图像处理原理），如果有更好的方式，希望大家可以留言给予建议~
首先是我们所需要的软件工具： 本次我们的开发环境为 Win10 所用到的软件工具分别为：Modelsim(10.5B), MATLAB(R2019a)
然后简述一下我们的操作过程（以图片 RGB 色域转换 YCbCr 色域处理为例），整体过程可简述如下：通过 MATLAB 将图片文件转换为 .txt 格式文件，使用 Verilog 读取相应文件后完成相应图像处理操作后输出为 .txt 文件，再次使用 MATLAB 将输出的 .txt 格式文件转换为图片文件并查看。以上步骤的意义在于不仅可以实现数字图像处理的单步可视化，还可以同原始的 MATLAB 对应的处理效果进行对比。(后期我们也会更新，直接使用 Verilog 完成图像读取并输出结果查看的方法)
首先我们通过以下程序(亦可查看附带工程中的 IMG2TXT.m 文件)在 MATLAB 端将图片生成 R,G,B 色域对应的 .txt 格式文件。并同时通过 MATLAB 生成 YCbCr 色域下三个分量的图像予以显示。 其关键代码如下：</description></item><item><title>拆解一个很有意思的开关</title><link>http://blog.strongwong.top/post/%E6%8B%86%E8%A7%A3%E4%B8%80%E4%B8%AA%E5%BE%88%E6%9C%89%E6%84%8F%E6%80%9D%E7%9A%84%E5%BC%80%E5%85%B3/</link><pubDate>Fri, 30 Aug 2019 20:54:54 +0000</pubDate><guid>http://blog.strongwong.top/post/%E6%8B%86%E8%A7%A3%E4%B8%80%E4%B8%AA%E5%BE%88%E6%9C%89%E6%84%8F%E6%80%9D%E7%9A%84%E5%BC%80%E5%85%B3/</guid><description>最近公司买了一个很有意思的开关，说是叫无源无线开关。无线嘛，就是没有电线连接，是无线的，好像是 433 无线模块通讯的。所谓无源就是没有电池或者其他直接的电源供电了，是一个自发电的开关。就是上图这个东东，我很是好奇，很想知道他这个自发电的开关内部是个什么样子，那我们拆开看看吧~ 嘿嘿~~
趁着下班了，大家都不在，我一个人开始在公司开拆！
这个无源无线开关和其他普通开关从外观上来看都差不多。它的塑料外壳和普通开关一样，轻轻撬开即可。打开外壳我们可以看到一根铜线，这应该就是用于无线通讯的天线了。卸下按键壳，下面就是整个开关的主体模块了。开关的主体很牢固的卡在底座上，只能硬撬下来了。
开关主体拿下来还是可以正常使用的，当我把主板上的壳子拆下来后，开关就不可以自发电了。主板的正面有 5 个电容按键，具体功能不得而知，可能是备用、兼容或者是为调试预留的？
拿下电容按键，看到主板背面线圈的一瞬间，相信中学物理还可以的朋友应该都能反应过来，这个开关的自发电原理应该就是咱们学过的电磁感应原理啊！通过线圈切割磁感线然后产生电能供应给其他电路使用。我迫不及待地卸下主板，想一探究竟，看看是不是我想的这样。但是主板和底座之间有一些机械机构互相钳制，费了好大力气才将主板卸下。
卸下主板后，我们看到底座上确实有一个由三个铆钉固定的磁铁。哈哈，果然是这样。在主体的壳子上有一个弹簧，怼着底座上的拨动机构，在开关按下的时候，拨动机构带动簧片拨动磁铁，磁铁的移动在线圈那端是有限位的，磁铁在一瞬间移动就相当于线圈切割了一次磁感线，从而产生电能给到其他负载。
拨杆机构细节图，挺有意思的一个结构。 然后来详细看一下主板：
在主板上主要有一颗 TI 的 CC115L 超值射频发射芯片、一颗 ST 的 stm8s003f3p6 8 位单片机、一个线圈以及电能采集储能电路。 stm8s003+CC115L/CC113L 的搭配在无线智能家居等场景好像应用很多。具体的芯片资料大家直接看厂商的 datasheet 吧，这里就不多做介绍了。
我仔细研究一下这个磁感线圈电能采集存储电路，主要有 5 个肖特基二极管，一个稳压二极管，一个 PMOS和一个 NMOS 丝印分别是 1GM 、2GM ，以及一个丝印为 A18F的未知芯片，没有找到直接对应的芯片型号，但根据电感来判断应该是一个 DC-DC 转换器，至于应该是降压还是升压就不太清楚了，因为拆开后就没有办法拨动开关产生电能，来测试对应点的电位了。我个人觉得这个线圈应该生产不了多大的电压，所以这里可能是一个升压的。通过按压，电磁线圈产生电能后，通过前级的电路采集后，到电感这里短暂存储，供控制器和射频芯片短暂地工作几十毫秒把控制信号发射出去，这样就可以控制接收端的各种设备了。简单理解了这部分的电路后，我简单绘制了一下这部分的原理图，不一定完全正确，但大体上应该是对的。有兴趣的朋友可以帮我看看，如果有什么错误的地方欢迎给我留言指正。
好了！这一次的拆解就到这里啦~，我要赶快装回去了，不能让大家发现！（逃~~）
简单总结一下吧！
这个无源无线开关还是很 nice 的，不用布线，不用电池，自发电，节能环保！发电线圈的设计也不失为一种新的低功耗方案，在一些更小体积的应用场景可能不太合适吧。 神奇的事情背后都有基本的科学知识，中学的物理知识就这样实际运用在我们的日常生活中啦！ 还有拆东西是一件很爽的事情！哈哈哈！ Have fun~</description></item><item><title>拆解某宝上热销的一款蓝牙耳机</title><link>http://blog.strongwong.top/post/%E6%8B%86%E8%A7%A3%E6%9F%90%E5%AE%9D%E4%B8%8A%E7%83%AD%E9%94%80%E7%9A%84%E4%B8%80%E6%AC%BE%E8%93%9D%E7%89%99%E8%80%B3%E6%9C%BA/</link><pubDate>Wed, 28 Aug 2019 21:52:27 +0000</pubDate><guid>http://blog.strongwong.top/post/%E6%8B%86%E8%A7%A3%E6%9F%90%E5%AE%9D%E4%B8%8A%E7%83%AD%E9%94%80%E7%9A%84%E4%B8%80%E6%AC%BE%E8%93%9D%E7%89%99%E8%80%B3%E6%9C%BA/</guid><description>前些天在某宝上购买了一个蓝牙耳机，想着跑步的时候可以听听音乐。我对耳机的要求也不高，听个响就行。于是，就下单了这个在某宝上热销的(10w+)超便宜的蓝牙耳机，只要 ￥19.9 还包邮！
用了几天，这个耳机对于只是听个响的我来说绝对 ok！也是对的起它这个价位了。但是没用几天，因为我的疏忽，没有将耳机从口袋拿出来，所以就跟着衣服一起在洗衣机里搅了 40 分钟&amp;hellip;&amp;hellip;
当我将它拿出来，晾干后，还能开机，正常连接手机。哈哈哈，没坏！我大喜过望，于是我赶忙播放音乐试试，结果发现就在连接上的一瞬间会有音乐。哎！乐极生悲了。它还是坏了，那就在扔掉之前看看它里面都有些什么吧&amp;hellip;&amp;hellip;.
我想按键控制区貌似比较好拆一些，先拆这个吧。结果，没办法还是不好拆，那就暴力点吧！
拆开后我们可以看到，蓝牙耳机的主要器件都分布在主板的正面。包括 一颗蓝牙 SoC 芯片，一个麦克风，三个贴了防水的按键，两个 LED 灯，一颗 26MHz 有源晶振以及 PCB 板载天线和一些阻容元器件。从主板正面看到有电感，因此可以推断芯片内部应该是集成了 BUCK 的，以降低芯片内部工作电压，降低功耗，从而提高待机时间，达到长时间使用的目的。
关于这个耳机的蓝牙主控芯片，貌似是支持蓝牙 5.0 的，但是我的手机不是所以也就不得而知了。我想根据这个丝印信息，找到关于这颗 SoC 芯片的一些信息，但是在网上我是怎么也没有找到对应的生产公司。这颗 SoC 上丝印的信息是 DCFB14D7B，找了半天好像也就这个公司的 logo 和芯片上的比较符合，一个叫欧标的公司。神奇的是这个公司貌似是做对讲机、中继台等无线通讯整机产品的公司。在官网上没有找到任何一个地方提到过他们有设计过蓝牙 SoC，但是由于他们也是做无线通讯相关产品的公司，所以我觉得很大概率上是这个公司的芯片。
我在搜索的过程中，还发现了一位智利的老哥拆解过一个，在全球速卖通上购买的 TWS 蓝牙耳机，也是使用的这颗蓝牙芯片（他的拆解）。照这样看，我觉得这个公司的蓝牙芯片应该是占据了中低端蓝牙耳机的大部分份额，神奇的是竟然还不为人所熟知！哦，对了这也是一个深圳南山区的公司，深圳南山区卧虎藏龙啊！哈哈哈！
主板的背面到没有什么东西了，主要就是一个 Micro USB 充电口，三个测试点以及连接两个听筒和电池的连接线。整个板的大小也就 42mm * 5mm ，集成度还是很高的。从 PCB 的生产日期（20190612）看，这批耳机貌似还是比较新的。
然后我们拆开电池仓看看，这是一块标称 3.7v/200mAH 的锂电池，接了两根从 PCB 拉过来的电源线。在电池的电源端我们还看到一块很小的 PCB，上面有两颗芯片。一颗是 DW01A，这是一颗锂电池保护 IC。主要是为了防止因为过充、过放、大电流等因素导致锂电池寿命缩短或者损坏的锂电池专用 IC。另外一颗是 8205，这是一颗双 MOS 开关芯片，主要是用来配合 DW01A 来共同构成锂电池保护电路。一路 MOS 用来控制防止过充，另一路 MOS 用来控制防止过放。
好了，到这里我们的拆解就基本完成了~
总结一下：
这个耳机虽然便宜，但是做工基本 Ok，对得起它这个价位了。 耳机内部虽然简单，但也是五章俱全了，该有的都有。 一个神奇的蓝牙芯片公司，做了低功耗设计，工作和待机时间都还可以。 Have fun ~</description></item><item><title>Archives</title><link>http://blog.strongwong.top/archives/</link><pubDate>Tue, 28 May 2019 00:00:00 +0000</pubDate><guid>http://blog.strongwong.top/archives/</guid><description/></item><item><title>Windows10 环境下搭建 RISC-V 调试环境</title><link>http://blog.strongwong.top/post/windows10-%E7%8E%AF%E5%A2%83%E4%B8%8B%E6%90%AD%E5%BB%BA-risc-v-%E8%B0%83%E8%AF%95%E7%8E%AF%E5%A2%83/</link><pubDate>Mon, 11 Mar 2019 10:32:02 +0000</pubDate><guid>http://blog.strongwong.top/post/windows10-%E7%8E%AF%E5%A2%83%E4%B8%8B%E6%90%AD%E5%BB%BA-risc-v-%E8%B0%83%E8%AF%95%E7%8E%AF%E5%A2%83/</guid><description>环境要求 软件环境 IDE: GNU MCU Eclipse IDE for C/C++ Developers IDE 插件: GNU MCU Eclipse plug-ins GCC/GDB 工具: GNU MCU Eclipse RISC-V Embedded GCC 调试工具: GNU MCU Eclipse OpenOCD make 工具: GNU MCU Eclipse Windows Build Tools Zadig 工具: Zadig 硬件要求 目标 RISC-V 芯片 调试器： J-Link，FT2232 或其他含有标准 JTAG 接口的调试器 配置环境 以下内容来自 ChenRQ 同学！
启动 IDE: GNU MCU Eclipse IDE for C/C++ Developers，Eclipse 基于 Java 开发，运行时需要 Java 的运行环境(JRE)，如没有请自行安装。
新建一个工程 工程类型选择 Hello World RISC-V C Project，工具链选择 RISC-V Cross GCC 如下所示</description></item><item><title>Contact</title><link>http://blog.strongwong.top/contact/</link><pubDate>Thu, 28 Feb 2019 00:00:00 +0000</pubDate><guid>http://blog.strongwong.top/contact/</guid><description> github.com/strongwong</description></item><item><title>使用汇编实现 pc 和 sp 的保存及恢复操作</title><link>http://blog.strongwong.top/post/%E4%BD%BF%E7%94%A8%E6%B1%87%E7%BC%96%E5%AE%9E%E7%8E%B0-pc-%E5%92%8C-sp-%E7%9A%84%E4%BF%9D%E5%AD%98%E5%8F%8A%E6%81%A2%E5%A4%8D%E6%93%8D%E4%BD%9C/</link><pubDate>Sun, 13 Jan 2019 19:32:27 +0000</pubDate><guid>http://blog.strongwong.top/post/%E4%BD%BF%E7%94%A8%E6%B1%87%E7%BC%96%E5%AE%9E%E7%8E%B0-pc-%E5%92%8C-sp-%E7%9A%84%E4%BF%9D%E5%AD%98%E5%8F%8A%E6%81%A2%E5%A4%8D%E6%93%8D%E4%BD%9C/</guid><description>前言 在 ARM Cortex 系列的芯片中本来就有一套保护现场的机制，例如当产生了一个中断时，会自动将当前寄存器的值入栈，并在 lr（r14） 寄存器中保存将要返回的 pc 值，在中断服务程序执行完成后将 pc 恢复到之前的位置。如果在执行中断服务程序的时候又发生了优先级更高的中断，也就是说发生了中断嵌套，这是将再次进行现场保护，同时 lr 值会被压栈（上一次的 pc ），新的 lr 生成。
但是在一些场景下，这样的机制就不太好用了，比如说要进入 sleep 模式 cpu 掉电了，想要恢复到掉电前的状态。这样的话就需要我们自己实现保护现场了，下面就来简单介绍一下我的实现。
硬件及 IDE 环境 硬件: Cortex-M3 FPGA 开发板 IDE: IAR 8.22.1 在进行 FPGA 验证之前，还跑了 RTL 的仿真，从仿真波形的结果来看也是正确的。
c 文件 现场保护主要就是保存当前的运行状态，在从 sleep 模式唤醒后将保存的状态恢复，使 cpu 回到到 sleep 之前的状态。在我们这里最主要的是保存 pc 和 sp 的值，cpu 唤醒之后恢复 pc 和 sp 就好，所以我们需要将进入 sleep 之前的 pc 和 sp 保存即可。
在进入 sleep 模式中，虽然 cpu 掉电了，但是 SRAM 还是维持着的，所以我们可以使用一个全局变量（存储在 SRAM 中）来保存 pc 和 sp 的值。</description></item><item><title>数字 IC 设计流程</title><link>http://blog.strongwong.top/post/%E6%95%B0%E5%AD%97-ic-%E8%AE%BE%E8%AE%A1%E6%B5%81%E7%A8%8B/</link><pubDate>Sun, 13 Jan 2019 18:41:35 +0000</pubDate><guid>http://blog.strongwong.top/post/%E6%95%B0%E5%AD%97-ic-%E8%AE%BE%E8%AE%A1%E6%B5%81%E7%A8%8B/</guid><description>0x00 最近即将开始要带着学弟们入门数字 IC 的设计，但很多学弟对于接下来要做什么是迷茫的，很多练就了各式各样的基本功却不知道如何施展，因此这里简单介绍一下数字 IC 设计的全过程及相关的设计工具及涉及到的相关职位，如果有写的不合适或者不正确的地方还请各位提出~
详见下图:
0x01 看了上图之后很多学弟就又问了，那平时我们都是 vivado，quartus，FPGA …… 为啥感觉和上面的都不沾边呢，这里说一点个人的看法，如果不是做硬件并行加速或者 FPGA 的嵌入式开发，那么平日 FPGA 的最大作用就是 —— 功能验证性工具。因为流片的价格非常昂贵，很少有实验室或者学校会让你不断地流片来实现你的设计，另外的，一个实验室如果没有同时具备设计，验证，版图 ……（全栈）技能同学的话要想能流片（同时具备以上技能）其实也很难的。那么这时 FPGA 就可以验证你的设计是否在一定程度上是正确的。
0x02 我们最后再来看一下数字前端的设计流程，如下图所示~
之前的 sdram 设计剩余部分,我们将尽快更新~
By Ricky</description></item><item><title>SDRAM 两次踏进同一条河</title><link>http://blog.strongwong.top/post/sdram-%E4%B8%A4%E6%AC%A1%E8%B8%8F%E8%BF%9B%E5%90%8C%E4%B8%80%E6%9D%A1%E6%B2%B3/</link><pubDate>Thu, 06 Dec 2018 20:48:31 +0000</pubDate><guid>http://blog.strongwong.top/post/sdram-%E4%B8%A4%E6%AC%A1%E8%B8%8F%E8%BF%9B%E5%90%8C%E4%B8%80%E6%9D%A1%E6%B2%B3/</guid><description>人不能两次踏进同一条河，但 SDRAM 可以 ——SDRAM的刷新
前言 上周去了趟深圳，所以摸鱼拖更了，在那边发现真的是机遇越大的地方努力的脚步就越匆忙，某企业的 boss 是位国家科学技术奖的获得者，公司已经上市了，却依然吃 13 元的小店套餐，而且饭几乎是倒进嘴里的，5 分钟左右吃完马上就又去和合作对象谈判去了！ …… 所以我们更要加油了，不然只会被大佬们越拉越远 …… 加油吧！
在初窥 sdram 中我们留了一个坑——首先我们在第一页就可以看到它的刷新周期是 64ms（这个重要参数将在后面进行具体介绍） 今天我们就来填这个坑&amp;hellip;&amp;hellip;
「人不能两次踏进同一条河流」是古希腊哲学家赫拉克利特说的。阐述「变」的哲学在米利都学派和毕达戈拉斯学派之后，爱菲斯的赫拉克利特创立了一种变的哲学。他的哲学充满了辩证法思想，对后来辩证法的发展产生过重大影响。
他形象地表达了他关于变的思想，说：「太阳每天都是新的。」他把存在的东西比作一条河，声称人不能两次踏进同一条河。因为当人第二次进入这条河时，是新的水流而不是原来的水流在流淌。SDRAM 不断地刷新，但却能保证刷新后的数据与刷新前一致，人踏进河是为什么我不知道，但是 SDRAM 正是为了保证内部电容的电量最终实现数据的不丢失才会不断地刷新。我们人做不到的事，就用 RTL 让 SDRAM 帮我们做了吧。
参数分析 首先我们来看 SDRAM 参数：8K Refresh Cycles/64 ms，意味着：
刷新速率 = 64ms / 8192 行 =&amp;gt; 7us； 刷新时钟周期 = 7us * CPU 运行频率； 例：CPU 运行频率 50MHz 时钟周期 = 7.81us * 50MHz = 390.5；64ms 为刷新周期最大值，为保证可靠运行，实际刷新实间要稍小于 64ms；例：时钟周期 = 390.5 ≈ 380
这就意味着每 380 个时钟周期，我们便需要对我们的 SDRAM 进行一次刷新，那么进行刷新的时候需要进行哪些操作呢？我们还是回到我们的数据手册中。 如图示，我们可以看到首先是要进行一次预充电操作(precharge)（同时选中所有的 bank），在经过 tRP 延时后进行一次自刷新操作(auto refresh)，再经过一次 tRC 后又进行一次自刷新操作(auto refresh)【注：实际使用中可以只进行一次自刷新操作】，最后进入到我们下一步 ……</description></item><item><title>初窥 SDRAM</title><link>http://blog.strongwong.top/post/%E5%88%9D%E7%AA%A5-sdram/</link><pubDate>Sat, 24 Nov 2018 17:21:08 +0000</pubDate><guid>http://blog.strongwong.top/post/%E5%88%9D%E7%AA%A5-sdram/</guid><description>前言 上次挖的坑现在来填，在我们把 SDRAM 控制器接进 AHB 总线之前，我们先来设计一个 SDRAM 控制器。
引用知乎上看见的一段话：
在做这个 SDRAM 控制器之前，博主有一个疑问，对于学生来说，是否有必要学习用纯 Verilog 写一个 SDRAM 控制器？因为目前广告厂（X）和牙膏厂（A）都有了 DDR IP Core，而 SDRAM 的控制 IP 更是漫天飞舞，对于要实现一个应用可以直接调用 IP Core，只需要对其接口操作即可。对于开发者来说，与其费时费力用 Verilog 去写一个性能差而且老的 SDRAM 控制器，还不如直接调用官方经过打磨的更为先进 IP Core。所以博主特地来号称平均学历 211，平均月薪 7、8 万的知（bi）乎提出了这个问题，得到的解答博主总结大致如下。
对于学生这个身份来说，应该是要以学习为主要目的，虽然说目前企业为了加快项目进度会直接使用 IP Core，但是我们以学为本的初衷不应该为了避过难点而直接不去尝试，就比如我们刚开始学 Verilog 的时候肯定都会写过分频器，那么为什么不直接去学更简单精度更高 PLL IP Core 呢？从一个新手逐渐成长成一个老手都是由简单到复杂，由基础到提升，这是一个必经的过程。这也就是很多高校还是会开设汇编语言编写单片机的课程，学 FPGA 全用 IP Core 和学单片机全用库函数是一个道理。这是其一。
第二，写一个 SDRAM 控制器还是可以锻炼一些典型的技能。
看官方文档 根据时序图设计 SDRAM 逻辑，使用状态机 配合仿真模型写测试仿真 调试，提高频率，让你的 SDRAM 跑的更快 研究时序约束 这一套做下来，你就可以提高一个层次了，经历过和没经历过是有质的区别。其实博主在提问的时候心中早已有了答案，只是还没有足够的信念去完成这个事情，当时看到很多业界前辈都支持去写的时候，博主心里也是比较开心的。之前博主已经学一些 SDRAM 的基础知识，只是当时水平还不够，没有坚持下去，心里一直不甘。趁着最近两个月之内没有什么事情要忙，所以决定要再次死磕 SDRAM。
正文 SDRAM 基本介绍 关于 SDRAM 的基本概念，在这再引用《终极内存指南》这篇文章中的一段话:</description></item><item><title>从计数器开始，看数字 IC 设计</title><link>http://blog.strongwong.top/post/%E4%BB%8E%E8%AE%A1%E6%95%B0%E5%99%A8%E5%BC%80%E5%A7%8B%E7%9C%8B%E6%95%B0%E5%AD%97-ic-%E8%AE%BE%E8%AE%A1/</link><pubDate>Sat, 24 Nov 2018 10:41:29 +0000</pubDate><guid>http://blog.strongwong.top/post/%E4%BB%8E%E8%AE%A1%E6%95%B0%E5%99%A8%E5%BC%80%E5%A7%8B%E7%9C%8B%E6%95%B0%E5%AD%97-ic-%E8%AE%BE%E8%AE%A1/</guid><description>计数器设计 之前有实验室的学长去参加海思、中芯国际、瑞芯微、&amp;hellip;&amp;hellip; 数字 IC 前端方向的面试，几乎都问到了同一系列问题——设计一个计数器及相关问题。这里很多朋友就会觉得很有意思了，为什么一个简单的计数器能有这么多东西，那我们就『简单』的东西简单看。
0x00 请你设计一个 10 进制的异步复位无限循环计数器（0-9） 首先，第一个问题，请你设计一个 10 进制的异步复位无限循环计数器（0-9），你会怎么做？
相信到这很多朋友就开始洋洋洒洒地写道：
module counter10( input clk, input rst_n, output wire cnt_flag ); reg[3:0] cnt_reg; always @(posedge clk or negedge rst) begin if( ~rst_n) begin cnt_reg &amp;lt;= 4&amp;#39;b0; end else begin if(cnt_reg == 4&amp;#39;d9) cnt_reg &amp;lt;= 4&amp;#39;b0; else cnt_reg &amp;lt;= cnt_reg + 4&amp;#39;b1; end end assign cnt_flag = (cnt_reg == 4&amp;#39;d9) ? 1&amp;#39;b1 : 1&amp;#39;b0; endmodule 0x01 请画出对应的电路图 Bravo! 没有任何问题！接下来开始有分水岭了，请画出对应的电路图 ，有的朋友可能会抓脑袋了：</description></item><item><title>使用 Docker + GitLab 构建自用的代码管理服务</title><link>http://blog.strongwong.top/post/%E4%BD%BF%E7%94%A8-docker-gitlab-%E6%9E%84%E5%BB%BA%E8%87%AA%E7%94%A8%E7%9A%84%E4%BB%A3%E7%A0%81%E7%AE%A1%E7%90%86%E6%9C%8D%E5%8A%A1/</link><pubDate>Tue, 13 Nov 2018 15:16:45 +0000</pubDate><guid>http://blog.strongwong.top/post/%E4%BD%BF%E7%94%A8-docker-gitlab-%E6%9E%84%E5%BB%BA%E8%87%AA%E7%94%A8%E7%9A%84%E4%BB%A3%E7%A0%81%E7%AE%A1%E7%90%86%E6%9C%8D%E5%8A%A1/</guid><description>准备工作 系统要求 一台 Ubuntu 系统的电脑作为服务器（我这里是一台 Ubuntu Xenial 16.04 的电脑），其他版本和系统也可以，只要 Docker CE 支持即可，详情请访问 Docker 官网。 GitLab CE 要求内存 2G 以上 Docker 安装及配置 Docker 是什么 Docker 使用 Google 公司推出的 Go 语言进行开发实现，基于 Linux 内核的 cgroup，namespace，以及 AUFS 类的 Union FS 等技术，对进程进行封装隔离，属于 操作系统层面的虚拟化技术。由于隔离的进程独立于宿主和其它的隔离的进程，因此也称其为容器。
Docker 在容器的基础上，进行了进一步的封装，从文件系统、网络互联到进程隔离等等，极大的简化了容器的创建和维护。使得 Docker 技术比虚拟机技术更为轻便、快捷。
传统虚拟机技术是虚拟出一套硬件后，在其上运行一个完整操作系统，在该系统上再运行所需应用进程；而容器内的应用进程直接运行于宿主的内核，容器内没有自己的内核，而且也没有进行硬件虚拟。因此容器要比传统虚拟机更为轻便。
它是目前最流行的 Linux 容器解决方案！
卸载旧版本 旧版本的 Docker 称为 docker 或者 docker-engine，使用以下命令卸载旧版本：
$ sudo apt-get remove docker \ docker-engine \ docker.io 使用 APT 安装 由于 apt 源使用 HTTPS 以确保软件下载过程中不被篡改。因此，我们首先需要添加使用 HTTPS 传输的软件包以及 CA 证书。</description></item><item><title>提升数字 IC 设计效率从 Vim 开始</title><link>http://blog.strongwong.top/post/%E6%8F%90%E5%8D%87%E6%95%B0%E5%AD%97-ic-%E8%AE%BE%E8%AE%A1%E6%95%88%E7%8E%87%E4%BB%8E-vim-%E5%BC%80%E5%A7%8B/</link><pubDate>Mon, 12 Nov 2018 16:10:29 +0000</pubDate><guid>http://blog.strongwong.top/post/%E6%8F%90%E5%8D%87%E6%95%B0%E5%AD%97-ic-%E8%AE%BE%E8%AE%A1%E6%95%88%E7%8E%87%E4%BB%8E-vim-%E5%BC%80%E5%A7%8B/</guid><description>Vim 这篇文章主要分享给在 Windows 下进行数字 IC 开发的盆友们，如果早已 linux，请大神自行忽略，另外建议在 Windows 下的盆友早日脚踏两只船。 相信大家都有过为了追一个信号而不断地缩放 RTL 图的经历，有没有一种办法能一键式一条龙服务呢？有！用 Vim！
Vim，一种类似于 notepad 的文本编辑器，其拥有你喜欢的一切功能（护眼模式，关键词高亮 …… 废话没有这些还叫代码文本编辑器），其针对 Verilog 的项目维护是真的善良，黑暗中的阳光。
但这阳光大多数情况下照亮于 Linux 或者 Unix 系统下，那我们试试怎么让光照进 Windows。 安装 Cygwin Cygwin 是一个在 Windows 平台上运行的 Unix 模拟环境，是 Cygnus solutions 公司开发的自由软件（该公司开发了很多好东西，著名的还有 eCos，不过现已被 Redhat 收购）。它对于学习 Unix/Linux 操作环境，或者从 Unix 到 Windows 的应用程序移植，或者进行某些特殊的开发工作，尤其是使用 gnu 工具集在 Windows 上进行嵌入式系统开发，非常有用。随着嵌入式系统开发在国内日渐流行，越来越多的开发者对 Cygwin 产生了兴趣。
下载好 Cygwin 后选择好安装路径，然后选择镜像网址，建议选择国内的镜像地址速度会快一些。可以使用网易的镜像地址：http://mirrors.163.com ,在 URL 栏自行输入镜像地址点击 add 添加后使用。
然后就进入选择安装包，初次进入建议都选择，高手可以有需要的时候可以再进来这个安装页面选择安装。 安装完成之后，把 Cygwin 添加到右键菜单，打开便是当前的路径下，这才是 Windows 该有的体验不是吗？而完成这一切只需简单地修改一下注册表。（以下步骤参考网络资源）：
使用Win + R打开运行窗口, 输入 regedit, 回车, 启动注册表编辑程序，找到 HKEY_CLASSES_ROOT\Directory\Background\shell 表项; 右键点击shell，选择新建-&amp;gt;项，命名为Cygwin，或者其他，你右键时看到的就是Cygwin,或者是你自定义的名称; 右键点击刚才创建的Cygwin，选择新建-&amp;gt;项,命名为command，表示点击该菜单项时要执行的命令; 双击command下(默认)数据项，在数值数据(V)下输入如下内容： &amp;quot;D:\Coding\Cygwin\bin\mintty.</description></item><item><title>总线- SoC 内部的主干道</title><link>http://blog.strongwong.top/post/%E6%80%BB%E7%BA%BF-soc-%E5%86%85%E9%83%A8%E7%9A%84%E4%B8%BB%E5%B9%B2%E9%81%93/</link><pubDate>Mon, 12 Nov 2018 11:35:18 +0000</pubDate><guid>http://blog.strongwong.top/post/%E6%80%BB%E7%BA%BF-soc-%E5%86%85%E9%83%A8%E7%9A%84%E4%B8%BB%E5%B9%B2%E9%81%93/</guid><description>总线—— SoC 内部的主干道 开坑！从今天开始来聊一点数字 IC 的一些知识！首先来看一看总线 平日里我们都在讲总线总线，连接各模块的公共线，那它在 ARM 芯片中起到了啥木作用，来胡乱绉一通。
总线的功能 总线通俗得理解可以完成以下功能：
提供时钟 分配（管理）地址 响应中断 传输数据 传送控制信号 USB 总线 以平日里最常见的 USB 为例，USB 其实也是一种总线如下图所示，通常我们计算机连接到 USB 后，USB 提供的总线可以拓展连接到我们的外设，例如 U 盘、键盘、鼠标等……但是设备本身不会与 CPU 进行通信，它们只与 USB HOST 进行通信，USB HOST 会给它们分配相应的中断。一旦 USB 设备插入 USB 接口引起物理上的电平变化便会有中断，此刻的中断并非 CPU 的中断，此时的中断是 USB HOST 的中断，此中断经一定的处理后发送至 CPU 后，CPU监测到是 USB HOST 中断，便将中断交付 USB HOST 进行处理。再来看地址的问题，CPU 是无法直接访问到你的设备的，红色方框内可以看做是一个“家族”，CPU 只能访问到其“家长” USB HOST，USB HOST 访问具体设备才用到地址访问。例如此时 U 盘的地址是 0x0007H，若此地址直接由 CPU 访问的话 CPU 最终只会访问到内存的 0x0007H，而非我们的 U 盘，因此将此地址交付 USB HOST 进行访问才能实现。这里就能看出不仅仅内存有地址，引入总线后，各个外设也有了对应的地址。</description></item><item><title>Tools</title><link>http://blog.strongwong.top/tools/</link><pubDate>Sun, 14 Oct 2018 00:00:00 +0000</pubDate><guid>http://blog.strongwong.top/tools/</guid><description>这里是我搜集的一些很好用的工具，点击名称进入下载或使用界面！ 资源均来自互联网，收集的软件仅供学习使用和交流使用，尊重任何软件的版权，版权及著作权属于原作者。
请合理使用！如无法进入，可能网站维护或更新或者需要科学上网
在线工具
Name 名称 Introduction 简介 Linux 命令搜索 Linux 命令大全搜索工具，内容包含 Linux 命令手册、详解、学习，值得收藏的 Linux 命令速查手册 cppreference.com 为程序员提供的完整的 C/C++ 语言及标准库的在线参考 AllDatasheet 中文 英文 最大的在线电子元器件数据搜索引擎！号称如果您在这里找不到，那么无论在世界的哪个地方，都不会找到！就是怎么强！ geogebra 免费的在线数学工具，在线图形计算器，可以绘图、几何、3D 等计算 Sci-Hub sci 论文下载 术语在线 由全国科学技术名词审定委员会主办的术语知识服务平台 元素周期表 一个炫酷的交互式元素周期表，十分详细 百度脑图 百度脑图，百度难得的一个还可以的产品。提供免安装、在线编辑、分享的思维导图服务 百度图说 百度图说，免费的、在线的简单图表制作 在线工具集 专门的在线工具集合网站，很全，很好用，UI 也好看 Ilovepdf 中文 英文 完全免费的 PDF 在线管理工具，其功能包括：合并 PDF 文件、拆分 PDF 文件、压缩 PDF 文件、PDF 文件格式转换等功能。功能强大，方便好用！ PDF 翻译 免费的在线 PDF 翻译工具，保持 PDF 排版。但是有大小限制，有时候翻译比较慢，国内不是很稳定 鸠摩搜索 一个专门搜索电子书的网站 B-OK 一个可以专门搜索英文电子书的网站 ACG 搜 一个强大的 ACG 搜索网站 在线 PS 一个精简版的在线 PS 工具，基本操作与桌面版 PS 基本相同 MSDN 提供包括操作系统、开发工具等微软原版镜像下载 flightaware 跟踪实时的航班状态 临时邮箱 一个一次性的临时邮箱，一个小时删除，可以用来接收网站验证码 临时网盘 一个临时的存储、分享网盘，文件（小于 1G）保存 24 小时后删除 桌面软件</description></item><item><title>使用树莓派 3b 和 RTL_SDR 搭建小功率无线电监测点</title><link>http://blog.strongwong.top/post/%E4%BD%BF%E7%94%A8%E6%A0%91%E8%8E%93%E6%B4%BE3b%E5%92%8Crtl-sdr%E6%90%AD%E5%BB%BA%E5%B0%8F%E5%8A%9F%E7%8E%87%E6%97%A0%E7%BA%BF%E7%94%B5%E7%9B%91%E6%B5%8B%E7%82%B9/</link><pubDate>Sun, 16 Sep 2018 20:03:40 +0000</pubDate><guid>http://blog.strongwong.top/post/%E4%BD%BF%E7%94%A8%E6%A0%91%E8%8E%93%E6%B4%BE3b%E5%92%8Crtl-sdr%E6%90%AD%E5%BB%BA%E5%B0%8F%E5%8A%9F%E7%8E%87%E6%97%A0%E7%BA%BF%E7%94%B5%E7%9B%91%E6%B5%8B%E7%82%B9/</guid><description>最近看了两部关于无线电相关的电影（『时空接触』、『黑洞频率』），对与无线电产生了很大的兴趣。现代由于互联网的发展，玩无线电的人越来越少了，了解无线电知识的人也不多了。但是还是有很多人在学习和使用软件定义无线电( Software Defined Radio &amp;ndash; SDR )，软件无线电可以做很多神奇事情！！
SDR 是个什么东西？ &amp;ldquo;软件无线电&amp;rdquo;( Software Defined Radio &amp;ndash; SDR )。实际上软件无线电技术的研究和开发已经有几十年的历史了，其中传统上以硬件实现的组件（例如混频器，滤波器，放大器，调制器\解调器，检测器等），通过个人计算机或嵌入式系统上的软件实现。最初源于美军的多制式电台项目，应用在军事领域。 在 21 世纪初，由于众多公司的努力，使得它已从军事领域转向民用领域，成为经济的、应用广泛的、全球第三代移动通信系统的战略基础。 到今天我们日常使用的移动通信系统中就在大量使用软件无线电技术， 比如基站中的信号处理大量的使用可编程的 FPGA 和 DSP 完成，比如手机当中的基带处理器也越来越多的采用软解调的方法(少数运算量特别大实时性要求特别高的模块除外，比如 turbo 解码器、扩频相关器等，这些模块往往在基带处理器中嵌入一些高度定制化&amp;quot;硬&amp;quot;核来实现)。
所以我们想要监听周围的无线电信号，自然是需要一个硬件的。
需要的硬件 RTL-SDR (或者 HackRF等) Raspberry Pi 3 (或者 Linux 系统的电脑) 有网络 高频天线 我选择的是一根支持 rtl-sdr 的电视棒，就是采用 RTL2832u (频率范围为 64-1700mh )解调芯片的。这是瑞晟( Realtek )的一个芯片型号，原本是做电视棒芯片的。后来被人发现这个芯片具有非常广的频率接收范围，然后就被用来做 sdr 应用了。十分廉价！
安装 RTL_SDR 驱动程序 硬件已经有了，接下来就是安装相关的软件驱动，才可以使用
打开一个 Terminal 窗口，进入到你的 home 目录下。先更新一下系统的软件，然后开始安装需要的软件依赖。具体操作如下：
$ cd ~ $ sudo apt-get update $ sudo apt-get install git $ sudo apt-get install cmake $ sudo apt-get install build-essential $ sudo apt-get install libusb-1.</description></item><item><title>关于 ARM Cortex-M3 的启动文件分析及分散加载</title><link>http://blog.strongwong.top/post/%E5%85%B3%E4%BA%8E-arm-cortex-m3-%E7%9A%84%E5%90%AF%E5%8A%A8%E6%96%87%E4%BB%B6%E5%88%86%E6%9E%90%E5%8F%8A%E5%88%86%E6%95%A3%E5%8A%A0%E8%BD%BD/</link><pubDate>Fri, 07 Sep 2018 11:22:44 +0000</pubDate><guid>http://blog.strongwong.top/post/%E5%85%B3%E4%BA%8E-arm-cortex-m3-%E7%9A%84%E5%90%AF%E5%8A%A8%E6%96%87%E4%BB%B6%E5%88%86%E6%9E%90%E5%8F%8A%E5%88%86%E6%95%A3%E5%8A%A0%E8%BD%BD/</guid><description>关于 ARM Cortex-M3 的启动文件分析及分散加载 下面以 ARM Cortex-M3 裸核的启动代码为例，做一下简单的分析。首先，在启动文件中完成了三项工作：
堆栈以及堆的初始化 定位中断向量表 调用 Reset Handler 在介绍之前，我们先了解一下 ARM 芯片启动文件中涉及到的一些汇编指令的用法。 补充一下，其中 DCD 相当于 C 语言当中的 &amp;amp;，定义地址。
堆栈以及堆的初始化 堆栈的初始化 Stack_Size EQU 0x00000400 这个语句相当于 Stack_Size 这个标号（标号：链接器的术语，下文中提到的所有“标号”，指的都是指的链接器中的标号）等于 0x00000400 相当于 C 语言中的 #define Stack_Size 0x00000400 ，也就是说此语句只是一个声明，并未分配地址。
AREA STACK, NOINIT, READWRITE, ALIGN=3 此语句定义了一个叫 STACK 的代码段，并指明 8 字节对齐（ALIGN = 3）。其中 NOINIT 表示未初始化，READWRITE 表示可读可写，ALIGN = 3，即表示 2^3 = 8，八字节对齐。
Stack_Mem SPACE Stack_Size 这里是为 Stack_Mem 分配 Stack_Size 大小的一块内存区域，注意这里分配的是 RAM ，即分配了大小为 1KB 的内存空间（0x00000400 = 1024）。</description></item><item><title>make 命令及 makefile 文件编写</title><link>http://blog.strongwong.top/post/make-%E5%91%BD%E4%BB%A4%E5%8F%8A-makefile-%E6%96%87%E4%BB%B6%E7%BC%96%E5%86%99/</link><pubDate>Mon, 03 Sep 2018 16:56:52 +0000</pubDate><guid>http://blog.strongwong.top/post/make-%E5%91%BD%E4%BB%A4%E5%8F%8A-makefile-%E6%96%87%E4%BB%B6%E7%BC%96%E5%86%99/</guid><description>前言 前段时间因为工作需要简单学习了一下 make 命令以及 makefile 文件的编写，这里整理一篇在网上看到的比较简洁明了的教程。
代码变成可执行文件，叫做 编译（ compile ）；先编译这个，还是先编译那个（即编译的安排），叫做 构建（ build ）。
Make 是最常用的构建工具，诞生于 1977 年，主要用于 C 语言的项目。但是实际上 ，任何只要某个文件有变化，就要重新构建的项目，都可以用 Make 构建。
本文介绍 Make 命令的用法，从简单的讲起，不需要任何基础，只要会使用命令行，就能看懂。我的参考资料主要是 Isaac Schlueter 的《 Makefile 文件教程》和《 GNU Make 手册》。
来源： http://www.ruanyifeng.com/blog/2015/02/make.html 作者： 阮一峰
Make 的概念 Make 这个词，英语的意思是&amp;quot;制作&amp;quot;。Make 命令直接用了这个意思，就是要做出某个文件。比如，要做出文件 test.txt ，就可以执行下面的命令。
$ make test.txt 但是，如果你真的输入这条命令，它并不会起作用。因为 Make 命令本身并不知道，如何做出 test.txt ，需要有人告诉它，如何调用其他命令完成这个目标。
比如，假设文件 test.txt 依赖于 a.txt 和 b.txt ，是后面两个文件连接（ cat 命令）的产物。那么， make 需要知道下面的规则。
test.txt: a.txt b.txt cat a.txt b.txt &amp;gt; test.</description></item><item><title>ROS 基础知识</title><link>http://blog.strongwong.top/post/ros-%E5%9F%BA%E7%A1%80%E7%9F%A5%E8%AF%86/</link><pubDate>Sat, 01 Sep 2018 10:59:46 +0000</pubDate><guid>http://blog.strongwong.top/post/ros-%E5%9F%BA%E7%A1%80%E7%9F%A5%E8%AF%86/</guid><description>ROS 基础知识 上一篇，我们已经正确的安装好了 ROS ，但是在使用 ROS 进行机器人开发工作之前，我们先来了解一点 ROS 的基础知识，以便于后面的开发使用。当然我这里自然是没有 ROS wiki 上介绍的详细，要想学习更多的操作请先看 ROS wiki 上的入门教程 这里我只简单介绍一下，在我的项目中会用到的一些操作。
创建工作空间 ROS 使用一个名为 catkin 的 ROS 专用构建系统。为了使用它，用户需要创建并初始化 catkin 工作空间，如下所示。除非用户创建新的工作空间，否则此设置只需设置一次。工作空间（ workspace ）简单来说就是一个存放工程开发相关文件的文件夹。主要目录结构如下：
src: 代码空间 ( source space ) build: 编译空间 ( build space ) devel: 开发空间 ( development space ) install: 安装空间 ( install space ) 创建工作空间 $ mkdir -p ~/catkin_ws/src # 创建工作空间机源码空间 $ cd ~/catkin_ws/src $ catkin_init_workspace # 初始化工作空间 编译工作空间 目前，只有 src 目录和 CMakeLists.txt 文件(运行初始化命令后就会生成)在 catkin 工作目录中，即使 src 目录中没有源代码，我们仍然可以使用 catkin_make 命令来进行构建。</description></item><item><title>在 Jetson TX2 上安装 ROS 机器人操作系统</title><link>http://blog.strongwong.top/post/%E5%9C%A8-jetson-tx2-%E4%B8%8A%E5%AE%89%E8%A3%85-ros-%E6%9C%BA%E5%99%A8%E4%BA%BA%E6%93%8D%E4%BD%9C%E7%B3%BB%E7%BB%9F/</link><pubDate>Sun, 26 Aug 2018 21:17:26 +0000</pubDate><guid>http://blog.strongwong.top/post/%E5%9C%A8-jetson-tx2-%E4%B8%8A%E5%AE%89%E8%A3%85-ros-%E6%9C%BA%E5%99%A8%E4%BA%BA%E6%93%8D%E4%BD%9C%E7%B3%BB%E7%BB%9F/</guid><description>ROS 机器人操作系统 关于 ROS ( Robot Operating System 机器人操作系统)，这里做一下简单的介绍。ROS 就是一个机器人软件平台，类似于个人电脑的操作系统( Windows、Linux、Mac OS 等)，智能手机的操作系统( Android、iOS 等)。机器人和电脑、手机一样可以通过各种硬件组合的硬件模块组成，自然就出现了用来管理这些硬件的操作系统。操作系统提供了基于硬件抽象的软件开发环境，存在提供各种服务的应用程序。 ROS 就是这样一个提供了类似操作系统的硬件抽象。在 ROS 维基中将 ROS 定义为 “ ROS 是一个开放源代码的机器人元操作系统。它提供了我们对操作系统期望的服务，包括硬件抽象、低级设备控制、常用功能的实现、进程之间的消息传递以及功能包管理。它还提供了用于在多台计算机之间获取、构建、编写和运行代码的工具和库。 ” 因此，ROS 并不是一种新的操作系统，确切的说，ROS 是一种元级操作系统。是基于现有操作系统的，利用应用程序和分布式计算资源之间的虚拟化层来运用分布式计算资源来执行调度、加载、监视、错误处理等任务的系统。同时提供一个或多个操作系统下的数据通信。
对于 ROS 的安装，之前官方网站上是没有中文教程的，对于我这种塑料英语，直接看官网英文教程还是蛮有难度的。不过好在现在 ROS 官网已经有中文版的安装教程了。直接参考官网上的教程安装就好了！ 官网安装教程：http://wiki.ros.org/cn/kinetic/Installation
ROS 版本 虽然官方已经有了中文版本的安装教程，但是我这里还是简单记录一下。 首先，ROS 目前大家使用的主流版本还是 ROS 1.0 的版本，ROS 1.0 版本目前只支持 Linux 系统。而对 ROS 兼容性最好的就是 Ubuntu 操作系统了，恰好我们的 Jetson TX2 就是 Ubuntu 系统。
这里还要说明的是，我们在 TX2 上安装 ROS 系统，并不是要直接在 TX2 上来做开发的(虽然也可以)， TX2 主要是作为部署端的。因此，还需要有一台 Ubuntu 电脑也需要安装上 ROS 来进行开发工作，安装步骤相同。
其次， Ubuntu 和 ROS 都有很多版本，各版本之间是存在兼容性问题的。ROS 和 Ubuntu 之间的版本对应关系如下表：</description></item><item><title>Jetson TX2 重新编译内核添加usb等驱动</title><link>http://blog.strongwong.top/post/jetson-tx2-%E9%87%8D%E6%96%B0%E7%BC%96%E8%AF%91%E5%86%85%E6%A0%B8%E6%B7%BB%E5%8A%A0usb%E7%AD%89%E9%A9%B1%E5%8A%A8/</link><pubDate>Mon, 20 Aug 2018 18:55:00 +0000</pubDate><guid>http://blog.strongwong.top/post/jetson-tx2-%E9%87%8D%E6%96%B0%E7%BC%96%E8%AF%91%E5%86%85%E6%A0%B8%E6%B7%BB%E5%8A%A0usb%E7%AD%89%E9%A9%B1%E5%8A%A8/</guid><description>Jetson TX2 重新编译内核添加usb驱动 上一篇我们已经简单说明了怎么给 Jetson TX2 刷机，Jetson TX2 虽然已经成功完成刷机了，但是 Nvidia 的默认配置是禁用了一些驱动的，比如说板子上的 UART 串口就不可以用，需要用户自己安装，重新编译新的镜像。 本文这里就简单介绍一下，添加驱动并重新编译镜像。 在 GitHub 上有别人开源的编译新镜像的脚本文件，在 Jetsonhacks 的仓库里有。这里我们就使用他的脚本文件。
下载脚本 首先从 GitHub 上下载编译脚本
$ git clone https://github.com/jetsonhacks/buildJetsonTX2Kernel.git 如果你是 JetPack3.2.1 版本，直接使用 git 下载的话没有问题，因为目前他更新到的最新版本是 JetPack 3.2.1 内核版本为 28.2.1 (2018-8-20)。但是我安装的是 JetPack 3.1 对应的内核版本是 28.1 所以是不能直接使用的。因此需要下载对应的内核版本的脚本才可以使用。 JetPack 3.1 版本的话就需要下载这个。 https://github.com/jetsonhacks/buildJetsonTX2Kernel/archive/vL4T28.1.tar.gz
解压，获取源码 下载好之后，解压缩，进入解压出来的文件夹，打开 Terminal 运行 getKernelSources.sh 脚本获取内核源码。
$ ./getKernelSources.sh 添加配置 下载完成之后就会打开一个 xconfig 配置界面。 设置你的镜像名称。打开设置 Genral Setup-&amp;gt;Local version - append to kernel release，双击 Local version - append to kernel release 在文本框中输入名字，如我这里为 -jetsonbot-v0.</description></item><item><title>Nvidia Jetson TX2 刷机并安装JetPack3.1</title><link>http://blog.strongwong.top/post/nvidia-jetson-tx2-%E5%88%B7%E6%9C%BA%E5%B9%B6%E5%AE%89%E8%A3%85jetpack3.1/</link><pubDate>Sun, 12 Aug 2018 20:15:29 +0000</pubDate><guid>http://blog.strongwong.top/post/nvidia-jetson-tx2-%E5%88%B7%E6%9C%BA%E5%B9%B6%E5%AE%89%E8%A3%85jetpack3.1/</guid><description>Nvidia Jetson TX2 刷机并安装 JetPack3.1 上篇，我已经简单介绍了一下我的整个小车的物理框架和软件架构。下面我可能会分成几次推文，介绍一下搭建小车的具体过程。 本次主要记录一下给 Nvidia Jetson TX2 开发板刷机的过程。
准备工具 1.一块Jetson TX2 开发板
2.一台安装 Ubuntu 系统的独立主机(不建议使用虚拟机，推荐使用 Ubuntu 16.04)
3.一台路由器
4.两根网线，一根 micro usb 数据线
准备工作 1.首先需要从 Nvidia 的官方网站上下载 Jet Pack3.1 的安装包，使用 Ubuntu host 直接下载或者下载好拷贝到 host 上也可以。(我当时最新的是 Jet Pack3.1 ，现在已经到 3.3 了，你也可以使用最新的版本。下载的话需要 Nvidia 账号才可以) 下载网址：https://developer.nvidia.com/embedded/jetpack
2.将 TX2 开发板和主机都通过网线连接到一台路由器上。准备好 TX2 开发板和 Ubuntu Host 之后就可以开始刷机了。
安装 下载好 Jet Pack3.1 安装包后，打开 Terminal 进入到安装包所在的目录，执行下面这条命令运行安装包。运行效果如下图。(如果文件没有执行权限可以使用 chmod -x file 命令来改变执行权限)
$ ./JetPack-L4T-3.1-linux-x64.run 运行完会弹出 JetPack L4T 3.1 Installer, 一路 Next 就好，如下图： 注意选择 Jetson TX2 开发板 点击 Next 之后会提示输入密码，待安装完成后，就会进入 JetPack L4T Component Manager。(这里要注意，如果网络不好可能会要等很久也出不来安装包信息，所以一定要保证网络环境好，可能有一些包还需要科学上网。) 如果你的包加载好了，检查一下 CUDA Toolkit 和 OpenCV for Tegra 这两个包是否选择了，这两个一定要安装。选择好之后，点击 Next 。在弹出的弹框中勾选所有协议，等待各种包下载完成。 下载完成后，选择 Host 和 TX2 的连接方式，我们选择第一项，通过同一路由器连接在同一网络。网口选择保持默认就好。 接下来就是将包移动到 TX2 开发板上。文件较大，可能要等一会。执行下一步后，会出现一个提示重启 TX2 的步骤。按照提示进行操作。</description></item><item><title>我的毕业设计--基于ROS的移动机器人</title><link>http://blog.strongwong.top/post/%E6%88%91%E7%9A%84%E6%AF%95%E4%B8%9A%E8%AE%BE%E8%AE%A1-%E5%9F%BA%E4%BA%8Eros%E7%9A%84%E7%A7%BB%E5%8A%A8%E6%9C%BA%E5%99%A8%E4%BA%BA/</link><pubDate>Sun, 12 Aug 2018 19:45:32 +0000</pubDate><guid>http://blog.strongwong.top/post/%E6%88%91%E7%9A%84%E6%AF%95%E4%B8%9A%E8%AE%BE%E8%AE%A1-%E5%9F%BA%E4%BA%8Eros%E7%9A%84%E7%A7%BB%E5%8A%A8%E6%9C%BA%E5%99%A8%E4%BA%BA/</guid><description>在做毕设的时候就有这个想法，想把毕设过程中学到的和遇到坑全都一点点的记录下来。但是由于毕设时间也比较紧张，又要上班，所以一直拖到现在也没有写些什么。好在最近毕设也答辩结束了，也毕业了，稍稍轻松了一些，准备最近花一些时间来整理一些毕设的东西，写几篇文字记录一下。接下来整体介绍一下这个机器人。
简单来说，我的毕设就是做一个可以进行室内 SLAM 建图的移动机器人。首先呢，我把我的机器人分为上层和底层两个部分。上层为决策层，主要是在 Jetson TX2 开发板上，运行 ROS 机器人操作系统以及 SLAM 算法。通过激光雷达或者深度相机获取深度数据，进行机器人的同时定位与地图构建。底层为具体的控制层，主要是 STM32 通过串口通讯与上层进行通信，接收决策层的速度控制指令，以及进行电机速度控制。机器人的系统框架如下图所示。
各部分的具体介绍，将在后面我有空的时候慢慢更新，哈哈哈~~</description></item><item><title>使用 Hexo+Github Pages 搭建个人博客</title><link>http://blog.strongwong.top/post/%E4%BD%BF%E7%94%A8hexo-github-pages%E6%90%AD%E5%BB%BA%E4%B8%AA%E4%BA%BA%E5%8D%9A%E5%AE%A2%E8%AE%B0%E5%BD%95/</link><pubDate>Thu, 02 Aug 2018 21:22:50 +0000</pubDate><guid>http://blog.strongwong.top/post/%E4%BD%BF%E7%94%A8hexo-github-pages%E6%90%AD%E5%BB%BA%E4%B8%AA%E4%BA%BA%E5%8D%9A%E5%AE%A2%E8%AE%B0%E5%BD%95/</guid><description>使用 Hexo+Github Pages 搭建个人博客记录 最近在学习的时候发现很多人都推荐说，要学会写作。很多大牛都会有自己的博客，或者微信公众号。不仅要学会学习，更要学会表达，而写作就是一个很好的方式。通过把自己学到的东西再次输出出来，才有价值，写作是一个人吸收知识，并增强记忆转化成自己东西的过程。很多人认为学校里出来了之后应该会很少写文字了，其实不然，在工作中经常会有各种各样的汇报和报告需要你去写。 如果你不经常去写一些文字，慢慢的也就生疏了，也就忘了该怎么通过书面方式更好的表达信息。比如我们领导让大家每周写一份周报，每到周五的时候大家总是在纠结，这周报该怎么写。还有做测试的时候要有测试方案，测试结果，测试报告（分析）都是要写文档的。跟文字打交道的时候还是很多的啊！所以啊，平时还得多写写！
我在看一些大牛的博客的时候，发现他们的博客，好像都很好看。我很羡慕，于是我也想搭建一个自己的个人博客，所以就有了本站！ 我了解到建站的方法有很多，比如:
Hexo + GitHub Pages Jekyll + GitHub Pages WordPress + 服务器 + 域名 DeDeCMS + 服务器 + 域名 &amp;hellip;&amp;hellip; 我选择了使用 Hexo + GitHub Pages + 域名 的方法来建站。 首先 Hexo 简约风格我很喜欢，其次利用 GitHub Pages 的免费存储空间不需要自己购买服务器， 有一个 GitHub 账号就 ok 了，然后域名其实是一个可选项，GitHub 会提供一个 http://xxxx.github.io/ 这种形式的域名进行访问。
下面来简单记录一下，本站的搭建过程 安装 Hexo 很简单，但是在安装前需要配置一些环境，需要安装 Node.js 和 Git 。因为 Hexo 博客系统是基于 Node.js 写的，需要 Node.js 的环境才能运行。 Hexo 运行之后会在本地生成网页，所以我们需要使用 Git 把本地网页文件上传到 GitHub 上的远程仓库里。（当然使用 GitHub 桌面版也可以上传。）</description></item><item><title>About</title><link>http://blog.strongwong.top/about/</link><pubDate>Sat, 28 Jul 2018 00:00:00 +0000</pubDate><guid>http://blog.strongwong.top/about/</guid><description>I am is a Embedded software/hardware engineer, Love to toss some techniques.
欢迎您访问我的网站，希望我分享的东西会对您有一些帮助！ 祝您 Coding 愉快！</description></item></channel></rss>