嵌入式系统与单片机|技术阅读
登录|注册

您现在的位置是:嵌入式系统与单片机 > 技术阅读

技术阅读

  • Windows 不区分大小写

    2024-07-17

    背景 之前就看过说 Windows 不区分大小写,但平时用得少倒也没什么体验,没想到还真能踩一次坑。上周有同事找我帮忙看个问题,说是配置修改后不生效。排查了下发现编译确实成功了,但烧录进板子的固件包却还是旧固件包。最终发现是路径下存在名字仅大小写不同的两个文件夹,xxxA 和 xxxa 。xxxA 是他顺手备份时改的,xxxa 才是真正每次编译都会更新的目标文件夹。这个在 Linux 上没什么问题,但映射到 Windows 上之后就混乱了,明明用烧录工具去选中了 xxxa 下的新文件,但工具真正读取到的却是 xxxA 下的旧文件,自然修改就不能生效了。其他 据说 W...

  • 记一个openwrt reboot异步信号死锁问题

    2024-07-17

    问题背景 在 openwrt 上碰到了一个偶现的 reboot 失效问题。执行 reboot 之后系统并没有重启,此时控制台还能工作。初步排查 首先复现问题,发现复现后控制台仍可正常运行,但此时重复执行 reboot 也无效,执行 reboot -f 则可正常触发重启。此处 reboot 是一个指向 busybox 的软链接,从 help 信息-f Force (don't go through init)中可以看出 reboot 和 reboot -f 的区别在于 reboot 会先通知 init 进程进行一系列操作,而 reboot -f 则直接调内核。看下 busybox 源码, 如果带了 -f 则直接调用 C 库的 reboot 函数,如果没有带 -f 参数,则...

  • cut-trailing-bytes:二进制尾部去0小工具

    2024-07-17

    背景 之前的文章 中介绍了一种使用 sed 去除二进制文件尾部的 NULL(十六进制0x00)字节的方法。最近发现这种方法有局限性,无法处理较大的文件。因为 sed 本身是行处理,几百M的二进制文件对 sed 而言就是一个几百M的行,这超出了 sed 的最大限制。具体的限制条件没有去探究,好像有的版本是硬编码了一个上限,有的版本是取决于可申请的内存。总之,sed 搞不定了,必须另寻他法。其实我一直相信有现成的工具可以做到,但在有限的时间内没能找到,就只有自己先写一个应应急了。如有人知道简单的办法,可以指教下。如果只是需要工具,后文就可以略过了...

  • 工具介绍:ncdu磁盘占用分析

    2024-07-17

    背景 磁盘空间的大小总是跟不上人民日益增长的文件存放需要。在暂时无法扩容的情况下,就只有删掉一些文件了。为了快速回收空间,最有效的做法当然是挑大文件下手了。linux 下获取文件大小,一般是使用du命令du -sh即可看到文件夹占用空间大小。但du本身执行很慢,每次又只针对一个文件夹,在这种场景下反复执行来找出大文件,无疑效率低下。ncdu 就是解决这个问题的。安装使用 ubuntu 下可以sudo apt-get install ncdu如果是需要在没有sudo权限没有网络的服务器上使用,那么一种方式是将本地安装好的bin直接拷贝上去,另一种方式就是把源码拷贝上去...

  • 脚本写一行echo也能写出bug ?

    2024-07-17

    背景 最近处理一个 bug 很有意思,有客户反馈某个配置文件解析失败了,出错的那行的内容就只有一个字母 a。最开始以为是谁改动了处理的脚本,但要到了问题代码中的脚本,比较发现跟库上是一样的。又经过一番查找,才发现原来是脚本中的一行 echo 引入的。问题代码 出问题的那行 bash 脚本是这样, echo 一个字符串到某配置文件中。echo [partition] >> xxx.config这行平平无奇的代码在大多数人的环境下,确实是正常运行的,但某些情况下会出 bug,那就是当运行脚本的目录下存在特定文件的时候。复现问题 看看例子,就明白了,其实就是匹配到了文件...

  • nor flash 之 4 字节地址模式

    2024-07-17

    背景 容量低于 16M bytes 的 nor,一般使用 3 字节地址模式,即命令格式是 cmd + addr[2] + addr[1] + addr[0] + ...使用超过 16M bytes 的 nor flash,则需要使用 4 字节地址模式, 即命令格式是 cmd + addr[3] + addr[2] + addr[1] + addr[0] + ...原因 为什么呢, 因为用 3 个字节表示地址,则其范围是 0x000000 - 0xffffff = 0 - 16M,超过 16M 的地址就无法表示了,那自然就得上 4 字节了。驱动修改 新的 uboot, kernel 驱动中都是支持的,配置下就可以了,如配置上 SPI_NOR_4B_OPCODES 。如果在用的 nor 驱动没有支持,那可以自行根据 datashee...

  • 从linux命令行分享文件:bashupload.com 和 transfer.sh

    2024-07-17

    背景传输文件是一个常见的需求,简单的做法是通过即时通讯工具,邮件,网盘完成。但当分享或接收的一端为远程服务器,只有命令行可以操作时,一个能支持在命令行完成分享和下载的工具,就会省下不少麻烦。下面介绍两个工具。这两个都是之前在别的地方看到过简单的介绍,看完只是记了名字,一直没机会用,平时都是局域网scp拷贝,直到最近远程办公突然有了这个需求,刚好适用,顺便总结下推荐给大家。bashupload.com简介借助bashupload.com,可以简单地从命令行上传文件,分析给其他的服务器,桌面和移动设备,最大支持25G。上传的文件会被保存7天,...

  • 记一个实时Linux的中断线程化问题

    2024-07-17

    背景有一个项目对实时性要求比较高,于是在Linux内核上打了RT_PREEMPT补丁。最终碰到的一个问题是,芯片本身性能不强,CPU资源不足,急需优化。初步分析看了下cpu占用率,除了主应用之外,有一个名为irq/38-twi0的进程引起了我们的注意,因为它竟然占据了10%的cpu。这个irq开头的进程是做什么的呢?原来这是一个被线程化了的中断服务程序,负责处理i2c中断的。这个项目i2c总线上挂载了多个设备,压力是比较大的。第一个想法是能否减少设备数量或者减低采集频率,但这会影响到应用的算法表现,暂时不考虑。第二个想法是优化代码,但打开中断服务程序...

  • 记一个uboot解压速度慢问题

    2024-07-17

    背景在项目中需要用到解压功能,之前还记录过,将uboot解压代码移植到另外的bootloader中时,碰到的效率问题。最终查明是cache的配置导致的。优化前速度是uboot的十分之一,优化后速度达到uboot的两倍多。没想到风水轮流转,最近在uboot中用了解压功能,结果最终在进行启动速度优化时,发现解压速度很慢,不仅比不上移植到另一个bootloader中的解压速度,而且比之前测到过的uboot解压速度要慢得多。同样的数据量,在另一个bootloader中解压耗时低于200毫秒,而记忆中的之前测到的uboot中耗时为数百毫秒,最新数据测得是接近2秒!嫌疑人:cache最开始...

  • nor flash之擦除和写入

    2024-07-17

    最近研究了下nor flash的掉电问题,对nor的掉电有了更多的认识。总结分享如下擦除从0变1,写入从1变0nor flash的物理特性是,写入之前需要先进行擦除。擦除后数据为全0xFF,此时写入操作,实际上是将数据从1改成0。一般先擦后写,但实际上擦除后每个位置是可以写入多次的,只要每次写入都是让某些bit从1变0即可。例如在擦除后数据为0xFF,此时写入0x0F,可读出0x0F,再写入0x01,可读出0x01,再写入0x00,可读出0x00。而对于0x00,就无法再改写成任何值了,因为此时每个bit都是0,想要改写就必须先擦除,让其恢复到0xFF,再进行写入改成目标值。多次...

  • 代码中大量的if/else,你有什么优化方案?

    2024-07-17

    来自:IT技术控原文链接地址:https://www.zhihu.com/question/344856665/answer/816270460观点一(灵剑):前期迭代懒得优化,来一个需求,加一个if,久而久之,就串成了一座金字塔。当代码已经复杂到难以维护的程度之后,只能狠下心重构优化。那,有什么方案可以优雅的优化掉这些多余的if/else?1. 提前return这是判断条件取反的做法,代码在逻辑表达上会更清晰,看下面代码:if (condition) { // do something} else {  return xxx;}其实,每次看到上面这种代码,我都心里抓痒,完全可以先判断!condition,干掉else。if (!condition) ...

  • C语言史上最愚蠢的BUG

    2024-07-17

    来自:酷 壳 - CoolShell原文:https://www.elpauer.org/2011/08/the-most-stupid-c-bug-ever/我相信这样的bug,就算你是高手你也会犯的,你来看看作者犯的这个Bug吧。。首先,作者想用一段程序来创建一个文件,如果有文件名的话,就创建真正的文件,如果没有的话,就调用tmpfile()创建临时文件。他这段程序就是HTTP下载的C程序。code==200就是HTTP的返回码。else if (code == 200) {     // Downloading whole file    /* Write new file (plus allow reading once we finish) */    g = fname ? fopen(fname,...

  • C++17一个很冷门很有意思的新特性

    2024-07-17

    最近发现了一个有意思的特性:void_t。void_t是C++17引入的一个新特性,它的定义很简单(有些编译器的实现可能不是这样,但也大体类似):template< class... >using void_t = void;看着它很简单,但它搭配SFINAE却可以在模板元编程中发挥巨大作用。比如在编译期判断类是否有某个类型using:template <class, class = std::void_t<>>struct has_type : std::false_type {};template <class T>struct has_type<T, std::void_t<typename T::type>> : std::true_type {};比如判断是否有某个成员:template <class, class = std::void_t<>>struct has_a_...

  • C语言太简单?这14道C语言谜题,你能答对几个?

    2024-07-17

    本文展示了14个C语言的迷题以及答案,代码应该是足够清楚的,而且有相当的一些例子可能是我们日常工作可能会见得到的。通过这些迷题,希望你能更了解C语言。如果你不看答案,不知道是否有把握回答各个谜题?让我们来试试。1下面的程序并不见得会输出"hello-std-out",你知道为什么吗?#include#includeint main(){ while(1) { fprintf(stdout,"hello-std-out"); fprintf(stderr,"hello-std-err"); sleep(1); } return 0;}参考答案stdout和stderr是不同设备描述符。stdout是块设备,stderr则不...

  • C语言函数返回1和返回0区别?

    2024-07-17

    来自公众号:碧茂大数据基本上,没有人会将大段的C语言代码全部塞入 main() 函数,更好的做法是按照复用率高,耦合性低的原则,尽可能的将代码拆分不同的功能模块,并封装成函数。C语言代码的组合千变万化,因此函数的功能可能会比较复杂,不同的输入,常常产生不同的输出结果。不同的输入,常常产生不同的输出结果C语言函数的返回值C语言函数可以通过返回值表示输出结果,例如 log() 函数的返回值会根据不同的输入,返回不同的值。再比如,我们定义一个函数 myopen(),用于打开某个文件,那么,这个函数要么能够成功打开文件,要么打开文件失败,这...

  • 这10个C语言技巧让初学者少走180天弯路!

    2024-07-17

    这10个C语言技巧(C语言仍然是常见的选择)可以帮助设计师避免因基础性错误而导致某些缺陷的产生并造成维护方面的困扰。技巧 1:不要使用“GOTO”语句二十几年前,当计算机编程尚处于起步阶段时,程序流程是由“GOTO”语句来控制。该类语句允许程序员对当前代码行断行,而直接进入另一个不同的代码段。列表1为简单的示例。列表1 使用GOTO语句编程语言终究开始引入了函数的概念,即允许程序对代码进行断行。如果已经完成,不再使用goto语句来表示代码的断行。函数调用后,函数将回到下一条指令。列表2为示例。这一做法改善了程序结构,提高了可读性。...

  • 从C语言实现面向对象探究class的秘密

    2024-07-17

    这里我想主要介绍下在C语言中是如何实现的面向对象。知道了C语言实现面向对象的方式,我们再联想下,C++中的class的运行原理是什么?首先我们来写一段C++的class,拿一个Student类来举例子:在头文件中,我定义一个Student类:#pragma onceclass Student {public:  void SetNumber(int number);  void SetGrade(int grade);  void Print();private:  int number;  int grade;};再在源文件中实现它:#include "studentpp.h"#include <stdio.h>void Student::SetNumber(int number) { this->number = number; }void Student::SetGrade(int g...

  • C++ std::function的开销

    2024-07-17

    经常看到说function的开销比较大,慎用function之类的讨论。那function究竟哪里开销大,我找到了一篇为function做profile的文章,这篇文章中的英文比较简单,我就不翻译了,英文吃力的朋友也可以直接看下面的数据:Popular folklore demands that you avoid std::function if you care about performance.But is it really true? How bad is it?Nanobenchmarking std::functionBenchmarking is hard. Microbenchmarking is a dark art. Many people insist that nanobenchmarking is out of the reach for us mortals.But that won’t stop us: l...

  • 分享一种你可能不知道的bug定位方法

    2024-07-17

    嵌入式Linux开发中,使用gdb对core文件进行调试是一种有效的定位程序崩溃的方法。有些知识,在没用到之前,可以简单地进行了解。实际用的时候,再去详细地学习。最近我在实际工作中使用了gdb对core文件进行调试,遇到了一些问题,总结出来分享给大家。本文我们来分享几点:什么是core文件?前台进程如何生成core文件?后台进程如何生成core文件?如何调试core文件?崩溃栈有用信息有限的可能原因?什么是core文件? 在Linux下,一个程序崩溃时,它一般会在指定目录下生成一个core文件。core文件仅仅是一个内存映象(同时加上调试信息),主要是用来调...

  • C++ 实用指南

    2024-07-17

    来自公众号:InfoQ作者 | Bartlomiej Filipek译者 | 王强策划 | 万佳C++ 发展得非常快!例如,C++ 标准的页数从 C++98/03 的 879 页增加到了 C++20 的 1834 页,多了近 1000 页!更重要的是,C++ 每次修订后,我们都会获得几十个新特性。你需要学习所有这些东西才能写出好代码吗?如何在当今的 C++ 世界中保持理智?介   绍你可能知道 C++ 是一种复杂的语言。我甚至发现了一整页 Wiki 是讲对 Cpp 的批判的。现代 C++ 甚至为生态添加了更多内容。以下是我之前提到的规范页数的完整数据:C++98/03-879,N1905,2005 年 10 月C++11-1324,最后草案...

  • C语言回调函数,提升C技巧必备

    2024-07-17

    来自:CSDN,作者:小熊coder链接:https://blog.csdn.net/qq_41854911/article/details/121058935一、函数指针在讲回调函数之前,我们需要了解函数指针。我们都知道,C语言的灵魂是指针,我们经常使用整型指针,字符串指针,结构体指针等int *p1;char *p2;STRUCT *p3; //STRUCT为我们定义的结构体但是好像我们一般很少使用函数指针,我们一般使用函数都是直接使用函数调用。下面我们来了解一下函数指针的概念和使用方法。1.概念函数指针是指向函数的指针变量。通常我们说的指针变量是指向一个整型、字符型或数组等变量,而函数指针是指向函数。...

  • 终端调试哪家强?

    2024-07-17

    来自:知乎,作者:韦易笑链接:https://zhuanlan.zhihu.com/p/32843449无数次被问道:你在终端下怎么调试更高效?或者怎么在 Vim 里调试?好吧,今天统一回答下,我从来不在 vim 里调试,因为它还不成熟。那除了命令行 GDB 裸奔以外,终端下还有没有更高效的方法?能够让我事半功倍?当然有,选择恰当的工具和方法,让 GDB 调试效率成倍的提升并没有任何问题。当然,前提条件是你至少会在使用最原始的 GDB。裸奔状态:原始的 GDB 命令行穿上各种衣服前,至少得先学会裸奔,找份简单的 GDB cheat sheet 对照一下:生产环境中出现崩溃时,因线上服务...

  • 哪些著名软件是用C、C++编写的?

    2024-07-17

    经常跟大家谈论C/C++是多么的厉害,但总是耳听为虚,还需眼见为实,那如何做到眼见为实呢?当然还是要从"业绩"出发,那么今天就跟大家找了一些内容,看看有哪些优秀的软件作品是C,C++的杰作呢?正文部分:1、操作系统(OS)Microsoft Windows :汇编 -> C -> C++备注:曾经在智能手机的操作系统(Windows Mobile)考虑掺点C#写的程序,比如软键盘,结果因为写出来的程序太慢,实在无法和别的模块合并,最终又回到C++重写。相信很多朋友都知道Windows Vista,这个系统开发早期比尔盖茨想全部用C#写,但是最终因为执行慢而放弃,结果之前无数软件工程...

  • 89 个嵌入式相关概念,你懂几个?

    2024-07-17

    01操作系统(Operating System,OS)是管理计算机硬件与软件资源的系统软件,同时也是计算机系统的内核与基石。操作系统需要处理管理与配置内存、决定系统资源供需的优先次序、控制输入与输出设备、操作网络与管理文件系统等基本事务。操作系统也提供一个让用户与系统交互的操作界面。02shell它是一个程序,可从键盘获取命令并将其提供给操作系统以执行。在过去,它是类似 Unix 的系统上唯一可用的用户界面。如今,除了命令行界面(CLI)外,我们还具有图形用户界面(GUI)。03GUI (Graphical User Interface)是一种用户界面,允许用户通过图形图标...

  • NSA:建议从 C/C++ 切换到内存安全语言

    2024-07-16

    来自公众号:OSC开源社区链接:https://www.oschina.net/news/217425/nsa-memory-safe-programming-language美国国家安全局(NSA)发布了一份指南,旨在帮助软件开发商和运营商预防和缓解软件内存安全问题。其鼓励组织将编程语言从 C 和 C++ 之类的语言转变为内存安全的替代语言 —— 即 C#、Rust、Go、Java、Ruby 或 Swift,以保护代码免受远程代码执行或其他黑客攻击。“NSA 建议企业尽可能使用内存安全语言,并通过编译器选项、工具选项和操作系统配置等代码强化防御措施加强保护。”NSA 方面表示,内存安全问题在可利用的漏洞中占比很大。并引用...

  • 详解C语言二级指针三种内存模型

    2024-07-16

    来自:亲宝软件园链接:http://www.qb5200.com/article/388044.html二级指针相对于一级指针,显得更难,难在于指针和数组的混合,定义不同类型的二级指针,在使用的时候有着很大的区别第一种内存模型char *arr[]若有如下定义char *arr[] = {"abc", "def", "ghi"};这种模型为二级指针的第一种内存模型,在理解的时候应该这样理解:定义了一个指针数组(char * []),数组的每个元素都是一个地址。在使用的时候,若要使用中间量操作元素,那么此时中间量应该定义为char *tmp = NULL;如果要打印这个数组,那么可以使用以下函数int printAarray...

  • Linux下文本编辑神器:Vim 最全图解

    2024-07-16

    作者:架构思考本文围绕Vim键位进行图解,最经典的版本如下所示。经典版英文版简体中文版对于上文提到的经典版不论是英文版还是简体中文版,根据你的英语水平进行选择。经典版其实都是一系列的入门教程键位图的组合结果,下面是不同编辑模式下的键位图。一口吃不成胖子,因此我们可以分步骤从易到难进行学习。入门版基本操作的入门版。进阶版增强版下图是一个更新时间较新的现代版,含有的信息也更丰富。文字版常用的命令:按字符、单词和标记移动按字符、单词和标记移动光标移动一个字符的基本键是:h–向左移动光标j–向下移动光标k–向上移动光标...

  • 一剑破万法:noexcept 与 C++ 异常导致的 coredump

    2024-07-16

    作为C/C++程序员,最不想见到的就是coredump。导致coredump的原因有很多,今天我来谈一下其中一种十分常见的原因,那就是由于C++异常没有被catch导致的coredump。从一篇知乎文章讲起先看一位知友的文章:C++11 std::thread异常coredump导致调用堆栈丢失问题的跟踪和解决(https://zhuanlan.zhihu.com/p/456536345)这篇文章说是这位知友遇到一次std::thread执行时coredump,但经过gdb调试后却无法一眼看到问题代码位置。有时候coredump不可怕,但是core栈不清晰最可怕。这次的问题的根因是在回调函数中抛出了异常但是没被catch导致,如果不是被std::th...

  • 神器 FFmpeg 6.0 发布

    2024-07-16

    ↓推荐关注↓转自:OSC开源社区(ID:oschina2013)在 FFmpeg 5.1 发布约 6 个月后,FFmpeg 6.0 "Von Neumann" 现已正式发布。该版本包含了许多新的编码器和解码器、过滤器以及 FFmpeg CLI 工具方面的改进。同时改变了发行方式,所有主要版本现在都会增加 ABI 版本;官方计划每年推出一个主要版本更新。另一个特定的更改是,废弃的 API 将在 3 个版本后,在下一个主要版本中被删除;一个主要版本的最后一个次要版本将是 LTS 版本。这意味着 FFmpeg 此后的发布将更加频繁、且更有条理性。FFmpeg 6.0 中新的解码器包括有 Bonk、RKA、Radiance、SC-4、A...

  • 一文了解 constexpr

    2024-07-16

    关于编译期动作,有必要介绍下constexpr。在这之前有必要简单提一下constexpr与const的关系,两者字面上都表达常量的意思。主要的区别是:const修饰的变量可以在运行时才初始化,而constexpr则一定会在编译期初始化。constexpr才是名符其实的常量,所有的constexpr都是const。而const表示的是read only的语义,保证修饰的变量运行时不可以更改,如果直接改动它,编译器在编译时会报错。const修饰的变量可以在运行时才初始化,而constexpr则一定会在编译期初始化。有人可能会用指针等骚操作来修改const修饰的变量值,这种情况下,CPP标准规定产生的是...