笔者作为常年工作在一线的 IT 技术研发人员,早在 2018 年就已经不玩儿互联网行业了。主要是感觉 Web 技术栈已然走向全家桶化(例如后端 Spring 全家桶、前端 Vue 全家桶),而开发方式也日趋套路化与工程化,上手难度与技术门槛以肉眼可见的速度不断下探,进而伴随着大量从业人员的持续涌入,整个行业全面开启了 996 内卷模式

除此之外,叠加近几日中概股跌穿了板凳,以及反垄断监管的不断强化,互联网行业合规经营的大幕徐徐拉开。未来全行业的整体薪酬水平,必然回归至类似财务会计这类市场化职位应有的水平。高薪光环终究是到了褪去的时刻,重新回到利润与收支挂钩的市场化薪酬体系,将会是整个行业未来的大势所趋。

阅读全文 »

Shell 既是一套命令行工具(交互式地解释和执行用户输入的命令)也是一种脚本设计语言(定义有变量与参数,并提供了控制、循环、分支结构)。Bash Shell 是由 GUN 官方项目提供的 Shell 解释器,名称源自于 Bourne Again SHell 的英文缩写,整合了传统 Korn Shell 以及 C Shell 的有效特性,并且尽量遵循IEEE POSIX P1003.2/ISO 9945.2规范,同时在编程与交互使用方面提供了大量的功能改进,因而在提供丰富功能的基础之上,展现出了良好的兼容特性,大多数.sh脚本可以无需移植修改即可交由 Bash Shell 来执行。

当用户登入任意一款 Linux 操作系统时,初始化程序init都将会为用户启动一个Bash Shell命令解析器,其即可以用于解析命令行输入并与内核进行交互,也可以作为高效的脚本编程语言,运用其提供的变量、参数、循环、分支等编程语法特性,完成一些批量的自动化的任务处理工作,本文将会围绕 Bash Shell 的脚本编程特性,加以进行详细的分析、说明与示例。

阅读全文 »

Qt 5.14.2 是跨平台应用开发框架 Qt 的最新版本,除了采用基于 C++11 的经典 Qt Widgets 进行桌面应用程序开发以外,还支持通过 Qt Quick 快速开发适用于移动端设备的用户界面,因为 Qt 5 底层图形渲染引擎基于 GPU 硬件加速,所以其能够保持与原生 C++ 近乎等同的运行效率。笔者计划通过两篇文章分别对这 2 种技术进行介绍,但是无论如何,在传统跨平台桌面应用开发领域,Qt Widgets 依然是 Qt5 最为基础与核心的内容。

虽然 Qt 6 发布在即,但是官方声明将会依然保持 API 的兼容与稳定性,因此本文依然基于当前最新的 Qt5 稳定版本撰写。全文将会分别对 Qt Widgets 当中使用较为频繁的窗口部件布局管理应用主窗口事件系统对象模型风格与样式国际化等部分内容进行深入介绍,同时展示完善的示例代码以及程序运行效果,并结合《QtQuick 篇》一文讲解混合编程相关的技术。

阅读全文 »

由于 Material Style 这样富含动画效果的用户界面风格,并不能简单的加入到以静态图形作为主要显示单元的QWidget当中。所以 Qt 官方推出了一种声明式编程语言 QML(Qt 元对象语言,Qt Meta-Object Language),其提供了一种具有更高可读性的声明式语法,并附带了必要的 JavaScript 语句和动态属性绑定支持。QML 的语言特性和引擎框架由 Qt QML 模块提供,该模块同时提供了 QMLC++ 两套接口。

Qt Quick 是一款基于 QML 的应用程序标准库,包含有可视化类型、交互类型、动画、模型和视图、粒子特效等特性,这些都是由 Qt5 上的Qt Quick模块提供,通过import语句即可方便的进行导入。Qt Quick 同样提供了 QMLC++ 两套接口,可以轻松构建具有流畅动画效果的动态 QML 用户界面。而 Qt 5.7 版本以后推出的 Qt Quick Controls 更是提供了丰富的开箱即用控件,让快速开发成为了可能。

阅读全文 »

万众期待的 Raspberry Pi 4B 终于发布,之前由于产品原型的需要,一直计划采购 3B+,后来供应商透露新版 4B 稍晚就会面市,所以稍微等待了一段时间,今天终于拿到了一块 2G 内存的板子。一直以为 4B 只会简单的更新一下 SoC 并增大 DDR 容量,但是实际上还带来了 Type-CBluetooth 5.0Micro HDMIUSB 3.0 乃至 DDR4 等诸多崭新升级。而官方推荐的应用范围,开始从教育渗透至工业领域,逐步发展为一套完整的嵌入式生态链。

本文基于树莓派基金会官方提供的 《Raspberry Pi Documentation》,笔者翻译了其中较为常用的配置章节,便于读者拿到板子以后能够快速上手,并避免使用一些官方不推荐的操作和工具库。此外,本文也会涉及 OpenCVdlib 的编译,以及 Electron 在树莓派上的部署等话题。文章内容将会伴随笔者的日常使用而长期进行更新,欢迎各位爱好者朋友持续关注与勘误。

阅读全文 »

对于国内中小型电子企业的工程师而言,Altium Designer、Pads、Allegro 等商业 EDA 工具的授权费用过于昂贵,且大部分仅提供了 Windows 操作系统版本,缺乏相应的跨平台支持。在电子行业版权问题逐步受到重视的今天,一款易使用、低成本的 EDA 工具对于广大电子工程师显得尤为重要。而 PCB 设计流程与布局布线经验超越 EDA 工具本身,如果没有丰富的元件库与封装库支持,也会面临无米难为炊的困境。

本文介绍的KiCad 是一款基于 GPL 开源许可下的跨平台 EDA 电子设计自动化工具集,能够处理多达 32 个铜层、14 个技术层、4 个辅助层的 PCB 电路板,并且生成加工制造所需要的所有文件(包括照片绘图仪的 Gerber 文件、钻孔文件、元件位置文件等),官方开源社区提供并维护了丰富的第三方库可供选用,而针对开源 EDA 工具普遍存在的自动布线功能偏弱的问题,KiCad 也通过FreeRouting提供了有力支持。文中所涉及原理图与 PCB 样图,皆已共享至笔者的 Github 项目Abrams

阅读全文 »

Android 可以采用 Kotlin、Java、C++ 语言编写应用程序,Android SDK 会将这些代码连同相应的数据和资源文件编译为 Android 软件包,即一个带有.apk后缀的归档文件,也就是 Android 应用程序的安装文件。本质上 Android 系统是一种多用户的 Linux 系统,每个应用程序都运行在独立的 Linux 用户 ID进程之下,从而为每个 Android 应用都提供了独立的安全沙盒,体现了最小权限的设计原则。

鉴于 Google 官方提供了完善的文档,本文并不过多过深的涉及 Android SDK 开发的具体知识细节,仅会在简单介绍 Android 开发当中的一些基本概念之后,着重分析经典/低功耗蓝牙NFCWIFI指纹识别5G 等硬件外设的通信协议概念以及相应的实现步骤,并且展示一些比较典型的应用场景与示例代码,从而为读者在进行物联网相关项目的开发时,在移动设备应用控制端提供即有的现成经验。

阅读全文 »

STLink 是由意法半导体公司推出的在线调试编程器,采用5VUSB2.0全速接口进行供电与数据传输,可以方便的对内部固件进行升级,同时支持以 JTAGSWD 模式连接至 STM32 系列微控制器,或者以 SWIM 模式连接至 STM8 系列微控制器,操作温度介于0 ~ 50℃之间。由于 ST 公司极为重视中国市场,因此 STLink 的销售价格相对其它国外大厂的在线仿真设备要实惠许多,基本成为国内嵌入式工程师人手上必备的工具。

本文详细介绍 Keil uVision 5 开发环境下 ST-LINK/V2 版本的调试编程器使用方法,并介绍了相关接口的详细定义与接线方法,文中部分内容翻译至意法半导体官方提供的《用于 STM8 与 STM32 的 ST-LINK/V2 在线调试编程器用户手册》,以确保使用方法与解释的规范性。

阅读全文 »

GNU Make用于控制如何从程序的源代码文件编译并链接为可执行文件,通过make命令从名称为makefile的文件中获取构建信息,该文件定义了一系列规则来指定源文件的编译先后顺序、是否需要重新编译、甚至于进行更为复杂的操作。通过makefile文件可以方便的实现工程的自动化编译,只需要执行make命令即可完成编译动作,从而极大的提高了开发人员的工作效率。

CMake 3.17是一款源代码构建管理工具,最初作为各种 Makefile 方言的生成器,后来逐步发展为现代化的构建系统,广泛用于 C 和 C++ 工程源代码的构建。官方提供的《CMake Tutorial》 为开发人员提供了一个循序渐进的指南,涵盖了 CMake 构建过程中常见问题的解决方案。如果需要构建从第三方发布的源代码包,则可以参考《User Interaction Guide》。而《Using Dependencies Guide》则主要针对需要使用第三方库的开发人员。

阅读全文 »

自本世纪六十年代开始,数字半导体技术席卷了全球电子工业,伴随工艺与制程的持续演进,高频高速电子信号的处理需求愈加旺盛,电子技术的发展重心逐步由模拟时代,过渡至全面的数字化阶段。虽然模拟电路以及分立式电子元器件的使用频率逐年下降,但是在电磁兼容性处理、开关电源设计等场景当中,传统的模拟电子技术以及相关分立式元器件依然扮演着不可或缺的角色。

本文定位为一篇导论性质的文章,用于帮助当前开发团队里的嵌入式软件工程师,快速了解模拟数字电子技术相关的术语与概念,因此行文中并不涉及各类电路原理的深入数学分析,仅仅言简意赅的汇总了日常工作相关的模拟、数字电路知识。文章中的部分公式与原理图摘取自Wikipedia 维基百科,写作过程当中参考了《Understanding Basic Electronics》第 2 版一书。

阅读全文 »

嵌入式 Linux 是将日益流行的 Linux 操作系统进行裁剪与修改,使之能在嵌入式硬件上运行的一种操作系统,拥有许多开源的参考与移植,也出现了 RTLinux 等实时性更强的发行版本。嵌入式 Linux 应用开发过程当中,会大量运用到 C 语言去开发原生的 Linux 应用程序,从而获得较小的存储空间占用,以及更高的执行效率,并且能够兼顾较好的代码维护效率。

本文首先会介绍文件 IO进程与进程间通信多线程网络编程等 Linux 原生应用程序开发的内容,然后分门别类的对串口GPIOSPII2C 等常用的协议开发进行了介绍。阅读本文前需要具备 C 编程语言基础,并且理解 GNU 编译器、链接器、调试器的相关概念。

阅读全文 »

2011 年,C++ 标准委员会发布了 ISO C++ 标准的一个重要修订版 C++ 11;该修订版是 C++ 语言演进过程当中的重要一步,也是当前获得编译器(GCCLLVMQt5Visual C++支持较多,兼容性最为优秀的一个版本。增添了类型说明符autodecltypeLambda 表达式智能指针 unique_ptr shared_ptr weak_ptr空指针 nullptr等诸多新特性,语言风格更加灵活统一的同时,极大提升了程序的编写效率。

本文基于《C++ Primer》一书最新的第 5 版撰写而成,该书作为 C++ 语言学习的经典读物,同样与时俱进增添了 C++ 11 的诸多新特性。因此,本文也选择了支持 C++ 11 标准的 Qt5 作为开发编译环境。由于 C++ 面向过程的语法与 C 语言类似,而笔者之前已经在《Linux C 标准程序设计》一文对相关内容进行了详尽的表述,因而本文将会着重笔墨水介绍 C++ 面向对象以及标准库方面的内容。

阅读全文 »

GNU 的正确发音为[g'noo],名称由英文句子GNU's Not Unix递归缩写组成,是一项由自由软件基金会推动的操作系统计划。GNU 计划最早开始于 1984 年 1 月,目标是完成一个由Hurd内核与一系列应用程序、系统库、开发工具组成的GNU 操作系统。但由于 Hurd 的开发工作迟迟未能完成,因而普遍选择采用 Linux Kernel 作为操作系统的内核,这一套技术组合正是闻名遐迩的 GNU/Linux 操作系统。

GCCGDB 组成的编译套件正是 GNU 计划下诞生的优秀开源项目,也是 GNU/Linux 技术体系不可或缺的构成要素。虽然当前 ClangLLVM 编译套件的发展风头正劲,但是由于嵌入式 Linux 设备通常只提供基于 GCC 的交叉编译工具链,加之两者在使用上差异不大,而 GDB 又同时提供了两者编译后程序的完整 Debug 支持,因而笔者依然选择 GCCGDB 组合来作为本文的撰写的目标。

阅读全文 »

Python 诞生于 20 世纪 90 年代初,是一款非常简洁易读的解释型脚本语言;擅长于科学计算与图形处理,传统的计算机视觉库 OpenCV、三维可视化库 VTK、医学图像处理库 ITK都提供了 Python 调用接口,Python 也原生提供了 NumPySciPymatplotlib等强大的科学计算扩展库。Web 应用开发方面,Python 也提供有 DjangoTornado 等开发框架。概而言之,得益于强大的开源社区支持,Python 已经成为一门功能丰富的胶水语言。

本文示例代码基于Python 3.6.6版本编写,在简单介绍相关语法以及 pipvirtualenv 等扩展库的使用之后,将会实现一个基于官方 XML 解析库ElementTree的 SVG 图片合并小程序。文中涉及的代码已经提交至笔者的 Github,需要的朋友可以直接进行克隆,任何缪误或者建议请向我提交issue。如果需要采用 Python 进行 Web 开发,可以参见我的《使用 Django2 快速开发 Web 项目》一文。

阅读全文 »

JTAG(Joint Test Action Group,联合测试行动组)是一种用于芯片内部测试的国际标准协议,ARMDSPFPGA等主流 IC 都对其提供了良好支持,标准 JTAG 接口拥有TMS模式选择、TCK时钟、TDI数据输入、TDO数据输出共 4 条信号线。笔者当前使用的 Mini2440 开发板原厂提供的 JTAG 调试器是采用并口的H-JTAG,由于现在的计算机设备早已经不提供并口支持,因此笔者选择了较为通用的J-Link作为 ARM9 仿真调试器。

J-Link是德国SEGGER公司推出的一款专用于 ARM 内核微控制器的 JTAG 仿真调试设备,能够与 ARM 官方提供的 Keil 集成开发环境无缝衔接,支持 Cortex-A/R、Cortex-M、ARM7、ARM9、ARM11、Renesas RX、Microchip PIC、Silicon Labs 8051、RISC-V 等系列的微控制器。笔者 7 年前购置了一台 J-Link V8 版本的J-Link调试器,当时由于使用不当造成固件丢失,因此特别撰写此文来记录一下固件恢复的过程。

阅读全文 »

开发人员长期以来对于 Microsoft Windows 操作系统总抱以嗤之以鼻的态度,笔者亲身经历了Windows XPWindows 7Windows 10的版本演变过程,抛开众所周知的偏见,事实上是能够感觉到系统稳定性、用户体验方面的大幅改善的,叠加近年来 CmderNeovim 等辅助开发工具的出现与逐渐成熟,作为软件开发环境,其使用体验已经完全可以与 Linux 媲美,并在图形界面的稳定性以及交互的友好性方面胜于后者。

但是对于广大硬件电子工程师而言,Altium DesignerPadsAllegro 等商业 EDA 工具仅提供支持 Windows 操作系统的版本,而高频高速 PCB 电路设计基本离不开 Windows 操作系统环境,因而 Windows 和 Linux 在笔者日常工作里都各自拥有着其不可替代性。本文主要用于记录一些笔者使用 Windows 10 操作系统的配置和习惯,便于切换到新的工作环境时快速的展开,因而全文也将会持续保持更新。

阅读全文 »

使用 Linux 作为日常开发工作环境近 5 年时间,尝试过DebianFedoraUbuntuMint等桌面发行版。虽然 Linux 作为服务器运行稳定可靠,但是在桌面 GUI 体验一直有待改进,显卡驱动兼容性与 CPU 占用率过高等问题一直悬而未决。而日常工作当中经常需要使用到的Altium DesignerKeil uVision等商业软件仅提供 Windows 10 版本,因此笔者时常需要在两款操作系统之间来回进行切换。

Linux Mint 提供了嵌入式开发当中必不可少的交叉编译环境,也能够直接安装 KiCADSTM32CubeIDEVSCodeSublime 等生产力工具;Windows 10 则提供了 Altium Designer、开发板串口驱动等大量无法跨平台使用的商业软件支持。本文主要用于备注两款操作系统当中一些常用的开发与工作环境配置,便于后续在全新工作环境中展开部署,以方便的移植个性化的使用习惯至新设备。

阅读全文 »

早期桌面应用的开发主要借助原生 C/C++ API 进行,由于需要反复经历编译过程,且无法分离界面 UI 与业务代码,开发调试极为不便。后期出现的 QT 和 WPF 在一定程度上解决了界面代码分离和跨平台的问题,却依然无法避免较长时间的编译过程。近几年伴随互联网行业的迅猛发展,尤其是 NodeJS、Chromium 这类基于 W3C 标准开源应用的不断涌现,原生代码与 Web 浏览器开发逐步走向融合,Electron 正是在这种背景下诞生的。

Electron 是由 Github 开发,通过将ChromiumNodeJS整合为一个运行时环境,实现使用 HTML、CSS、JavaScript 构建跨平台的桌面应用程序的目的。Electron 源于 2013 年 Github 社区提供的开源编辑器 Atom,后于 2014 年在社区开源,并在 2016 年的 5 月和 8 月,通过了 Mac App StoreWindows Store 的上架许可,VSCode、Skype 等著名开源或商业应用程序,都是基于 Electron 打造。为了方便编写测试用例,笔者在 Github 搭建了一个简单的 Electron 种子项目Octopus,读者可以基于此来运行本文涉及的示例代码。

阅读全文 »