问题产生无论是Linux,RTOS,还是Android等开发,我们都会用到多线程编程;但是往往很多人在编程时,都很随意的创建/销毁线程的策略来实现多线程编程;很明显这是不合理的做法,线程的创建/销毁代价是很高的。那么我们要怎么去设计多线程编程呢???答案:对于长驻的线程,我们可以创建独立的线程去执行。但是非长驻的线程,我们可以通过线程池的方式来处理这些线程。线程池概述线程池,它是一种多线程处理形式,处理过程中将任务添加到队列,然后在创建线程后自动启动这些任务。线程池线程都是后台线程。每个线程都使用默认的堆栈大小,以默认的优...
概述在之前的一篇文章中,作者写了一个事件组件-- ,这个组件是采用链表建立所有事件节点的关系的。链表的优缺点:优点:①链表上的元素在空间存储上内存地址不连续;②在插入和删除操作时,只需要修改被删节点上一节点的链接地址,不需要移动元素;缺点:①没有解决连续存储分配带来的表长难以确定的问题;②失去了顺序存储结构随机存取的特性;③不能通过数学表达式计算被查找元素的内存地址,每一次查找都是从头节点开始遍历,直到找到为止。SPEvent实际不会存在删改的动作,显然链表的优点在这个组件中无法体现优势。而实际顺利存储更能满足SPEv...
概述 传统的嵌入式单片机开发基本上形式如下图:该流程对于功能单一或者功能变更极少的场景是比较友好的,但是对于设备应用层变更比较多或者公板方案开发应用的场景,上述场景显的有些累赘。那么有什么方式可以解决呢??对于设备应用层变更比较多或者公板方案开发应用的场景,可能因为应用层稍微修改一下就要出固件版本验证,这对于版本管理,时间周期,固件质量都是比较不友好的。那么我们如何避免这些问题??那么有什么方式呢??答案是有的,如:使用动态模块或者胶水语言(JerryScript,PikaScript)动态模块:它更多的是一个 ELF 格式加载器,...
概述互联网时代,安全成为了一个沉重的话题。文件传输、电子邮件等的安全性尤为重要。我们为了保证安全性,必须对其内容加密,加密的作用就是防止有用或私有化信息在传输链路上被拦截和窃取。提高数据传输的可靠性。在嵌入式开发中,我们会涉及到数据的传输,文件的传输。很多人都没有考虑其数据的安全性问题,往往都是明文的方式传输,最多增加CRC进行数据的完整性校验。这明显没有考虑数据的安全性问题。最近项目遇到安全性问题,所以也开始折磨一下加密相关知识,发现RT-THREAD有个比较好软件包--tinycrypt(一个简小并且可配置的加解密软件包,...
粉丝朋友:开工大吉,新年新气象!祝各位粉丝朋友前“兔”无量,“兔”飞猛进,大展鸿 “兔!兔年首档迎春活动,与瑞萨MCU官方公众号、专注于嵌入式技术分享的优秀号主,为大家奉上66件开工礼,帮助粉丝朋友们学好嵌入式技术,拓宽视野,开工“兔”个开心。礼品介绍:CPK-RA6M4 开发板 *11块CPKIOT-RA6M5 开发板 *11块CPK-RA2L1 开发板 *11块CPK-RA2E1 开发板 *11块FPB-RA4E1 开发板 *11块FPB-RA6E1 开发板 *11块RA系列MCU产品基于Arm Cortex-M内核,与瑞萨自有内核RL78和RX系列一起,成为瑞萨MCU产品线齐头并进的三驾马车。RA2、RA4 ...
概述作者一直有一个想法,就是写一个功能强大的桌面小工具,里面集成各种平时开发要用的工具。例如:串口助手,网络助手,下载工具等。那么如何也带来几个问题:问题1:那么如何呈现在桌面上也是一个非常重要的问题 -- 桌面悬浮窗。问题2:工具的名字 -- RTOOL(米饭工具)问题3:是否贡献整个工具 -- 分为两个版本:开源版本和公司项目版本(已经发布了V1.0版本)。本篇文章介绍RTOOL的JLINK烧录小工具,那为什么要在RTOOL中集成JLINK的烧录工具呢?原因:像MCU,我们如果使用GCC构建我们的程序后,没有IDE的支撑,就需要使用JFLASH这样的工具进行烧...
架构说明本项目以 STM32MP157A-DK1 为硬件平台。作为能够支持轻松开发更广泛应用的通用微处理器产品线,STM32MP157 系列基于双核Cortex-A7 与 Cortex-M4 组成的异构架构,加强了支持多应用和灵活应用的能力,可以随时实现最佳性能和功率数据。Cortex-A7 内核提供对开源操作系统(Linux/Android)的支持,而 Cortex-M4 内核可以利用 STM32 MCU 的生态系统。本篇文章将介绍如何在 STM32MP157 上运行 RT-Thread OS。启动方式Forced USB boot For flashing : 通过 USB 烧写固件。在此模式下,可以使用 STM32Cube Programmer 工具烧写 A7 核固件。Enginee...
GitHub可谓是开源世界的宝库,里面有牛人们开源的各种形形色色的项目,当然了为了从GitHub clone项目,合理上网也是必不可少的。在合理上网之后,有时候从GitHub clone项目依然会出现类似下面的错误:fatal: unable to access 'https://github.com/xxx/xxx/': Failure when receiving data from the peerfatal: unable to access 'https://github.com/xxx/xxx/': Failed to connect to xxxfatal: unable to access下面就讲讲目前来说解决类似上述问题比较好的办法。方法1:设置git代理查看git配置使用命令查看git配置情况,查看代理的设置是否是正确...
在计算机内部数值是以补码的方式进行存储的,采用补码进行数据存储当然有其优点,下面会一一介绍相关内容,让各位彻底弄懂原码、反码、补码的概念以及为什么采用补码作为数据存储的方式。注意:下面列举的例子均是指8位的字节数据。对于16位,32位的数据同样适用,只是为了书写方便,8位是最好的选择啦!1、无符号数与有符号数在介绍原码、反码和补码的概念之前,先来了解下无符号数和有符号数。在计算机系统中,我们可以将数分为两类:无符号数和有符号数。无符号数的意思是我们不关心这些数的符号,因此也就无所谓正负,反正它们就是数而已,就像...
1.Makefile简介 Makefile是和make工具一起配合使用的,用于组织管理项目源代码的编译和链接。make工具用于找出修改过的文件,根据依赖关系,找出受影响的相关文件,最后按照规则单独编译这些文件。Makefile文件则记录依赖关系和编译规则。Makefile的本质:无论多么复杂的语法,都是为了更好地解决项目文件之间的依赖关系。2.Makefile规则介绍 Makefile的一个规则由目标、依赖、命令组成,其语法结构如下所示:目标:依赖的文件或者是其他目标<tab>命令1<tab>命令2<tab>...一个规则可以有多个命令行,每一条命令占一行。注意:每一个命令行必须以[Tab]...
C语言中,在宏里面使用’#’和’##’有它非常神奇的作用。在宏定义的替换的过程中,#号可以作为一个预处理运算符,把宏参数转换为字符串。##运算符则可以把两个宏参数组合在一起。下面就来说说具体的用法。1、一般用法 我们使用#把宏参数变为一个字符串,用##把两个宏参数贴合在一起。下面的代码是演示代码:#include <stdio.h>#define STRING(s) #s#define CONNECT(a, b) (int)(a##e##b)int main(void){ // 输出字符串"abcdefg" printf("string:%s\r\n", STRING(abcdefg)); // 2e3...
eMMC总线拓扑 在eMMC总线中,可以有一个Host,多个eMMC设备。总线上的所有通信都是以Host发送一个Command给eMMC开始的,eMMC对于收到的不同Command会做出不同的response,当然了eMMC对于收到的部分Command可以不做response。Host一次只能与一个eMMC设备通信。在上电启动后,Host会为所有eMMC设备依次分配相对地址(RCA,Relative card Address)。当Host需要和某一个eMMC设备通信时,会先通过RCA选中该eMMC设备,只有被选中的eMMC设备才会响应Host的Command。eMMC总线协议 在系统上电复位后,Host必须使用eMMC总线协议指定的message来初始化eMMC设备...
一、数字音频技术1.声音数字化概念及过程 现实生活中的声音是通过一定介质传播的连续的波,它可以由周期和振幅两个重要指标描述。正常人可以听到的声音频率范围为 20Hz~20KHz。现实存在的声音是模拟量,这对声音保存和长距离传输造成很大的困难,一般的做法是把模拟量转成对应的数字量保存,在需要还原声音的地方再把数字量的转成模拟量输出如下图所示:2019-10-17_111146模拟量转成数字量一般可以分为三个过程,分别为采样、量化、编码,如下图所示。用一个比源声音频率高的采样信号去量化源声音,记录每个采样点的值,最后如果把所有采样点数值连...
获取软件:私信回复寄存器查看器可以获取软件。对于搞嵌入式底层开发的软件或者硬件工程师来说,经常会涉及到查看芯片手册,比如某个芯片的串口控制器的寄存器值,需要知道这个值对应寄存器的哪些位,微软计算器的程序员模式虽然可以查看寄存器值的2进制或者16进制位关系,但是对寄存器数值的每一位并没有很直观的展示。因此就需要一个软件直观的查看寄存器值与位的关系。我在网上找了一个软件进行使用,感觉还是可以,但是有些功能还是不太满意,因此自己寻思着手写一个寄存器查看器,按照自己想要的功能和布局进行编写,这个想法已经有很久了,由...
在嵌入式开发过程中,经常需要对代码进行调试来解决各种各样的问题,常用的调试手段有:(1)、开发环境搭配硬件仿真器进行在线调试。优点:调试过程中能够清楚的知道各个寄存器的值以及各个变量的值,程序的执行流程也能够一目了然。缺点:板卡需要引出硬件仿真器的连接口,并且需要购买硬件仿真器。(2)、通过调试串口打印信息梳理程序的执行流程,结合代码分析问题产生的原因。优点:足够简单,通过增加较多的打印信息来分析问题出现的位置,再结合代码分析问题产生的原因。缺点:没法准确的定位问题产生的位置和原因。(3)、在应用或者操作系统死机...
为了描述方便,将ARM Compiler 5简称为AC5,将ARM Compiler 6.12简称AC6.12。在公众号中回复"arm编译器升级文档"可以获取AC5升级到AC6.12的ARM官方文档。1、armasm编译汇编代码,链接失败的问题 这里新开一篇博文,专门讲讲针对ARM格式的汇编代码,使用AC6.12应该如何处理。下述内容大多来自文档《migration_and_compatibility_guide_100068_0612_00_en.pdf》文档的 3.3 Command-line options for preprocessing assembly source code。我在我自己的工程中遇到过使用AC6.12编译汇编代码成功,但是链接会失败。提示内容大致是:xxx.scf Error: L6236E...
为了描述方便,将ARM Compiler 5简称为AC5,将ARM Compiler 6.12简称AC6.12。在公众号中回复"arm编译器升级文档"可以获取AC5升级到AC6.12的ARM官方文档。1、为什么要进行ARM编译器版本的更换 目前,AC5基本处于停止更新状态,如果想要使用AC5编译器编译新的ARM架构或者内核的代码,基本是不可能了,因此自然要使用ARM Compiler 6来代替之前的ARM Compiler 5。其实,我自己觉得还有一个比较重要的原因,那就是AC6支持使用armclang编译GNU语法格式的汇编代码,这样在以后的项目开发中,可以只编写GNU语法格式的汇编代码(不必像以前一样还要再写一份符...
1.概述 目前网络上使用stm32 spi的nss,基本上都使用的是nss的软件管理模式。对于nss的硬件管理模式,程序的配置以及对nss的软件管理模式与硬件管理模式的说明,真的少之又少。这可能跟stm32官方文档对nss的描述不清也有很大关系吧,下面就带大家理解理解nss,当然了这篇文章是笔者阅读了stm32 spi官方文档再结合网友的一些文章,最终以自己个人对nss理解来编写的,如果有错误之处,还请指正。2.nss的管理模式 nss的管理模式分为:硬件管理和软件管理。nss的管理模式由SSM决定。nss其实分为外部引脚和内部引脚的。外部nss引脚就是芯片上肉眼可见的与...
协处理器概述 ARM架构通过支持协处理器来扩展处理器的功能。ARM架构的处理器支持最多16个协处理器,通常称为CP0~CP15。下述的协处理器被ARM用于特殊用途:CP15:提供系统控制功能,主要用于配置MMU、TLB和Cache等功能。CP14:主要用于控制系统Debug功能。CP10、CP11:两个协处理器一起提供了对浮点运算和向量操作的支持,这两个协处理器主要用于控制和配置浮点功能和高级SIMD指令扩展。其他协处理器被ARM保留用于将来使用。本文主要说说CP15协处理器。CP15协处理器总览 CP15是系统控制协处理器,主要用于对ARM处理器核心支持的许多特性功能进行配置...
在Linux系统中提供了多种同步机制,本文主要讲讲如何使用pthread_barrier_xxx系列函数来实现多线程之间进行同步的方法。函数定义 pthread_barrier_xxx系列函数中的barrier可意为栅栏,可以理解为该栅栏能够把先后到达的多个线程阻挡在同一栅栏前,直到所有线程到齐,栅栏才会放行,否则到达此处的线程将被阻塞。pthread_barrier_xxx系列函数在<pthread.h>文件中定义,用于多线程的同步,该系列函数主要包含下列三个函数:// 初始化栅栏,负责指定栅栏要等待的线程个数,// 栅栏需要等待count个线程都到达栅栏时,才会全部一起放行int pthread_barrie...
对于现代操作系统,通常情况下用户的应用程序运行在用户态,操作系统内核运行在内核态。用户态的应用对于系统硬件资源的访问是受限的,内核态则能够访问所有的系统硬件资源。操作系统的用户态和内核态是根据处理器的特权等级和运行模式进行硬件隔离的,这也极大的提高了操作系统的安全性。安全扩展和虚拟化扩展 ARMv7-A体系结构支持安全扩展和虚拟化扩展。当处理器实现了安全扩展之后,处理器就存在普通世界(Normal world)和安全世界(Secure world)这两个世界,这在硬件层面上就可以将敏感数据和要求在安全环境运行的应用和普通应用完全隔离,如...
程序状态寄存器的作用就是反映处理器的状态信息。在程序运行期间我们可以通过查看程序状态寄存器的状态位来进行程序的分支跳转处理,或者我们可以设置程序状态寄存器的模式位来改变处理器的运行模式,或者我们可以设置程序状态寄存器的中断屏蔽位来屏蔽中断。在任何时刻,我们可以访问处理器的16个寄存器(R0~R15)和当前程序状态寄存器(Current Program Status Register,CPSR)。用户模式下的程序访问的程序状态寄存器叫做APSR(Application Program Status Register),APSR是CPSR在用户模式下的别名,因为在用户模式下CPSR的部分域是不能操作的...
1、WAV文件概述 WAV是微软公司开发的一种音频格式文件,用于保存Windows平台的音频信息资源,它符合资源互换文件格式(Resource Interchange File Format,RIFF)文件规范。标准格式化的WAV文件和CD格式一样,也是44.1K的取样频率,16位量化数字,因此在声音文件质量和CD相差无几!WAV通常用来保存PCM格式的原始音频数据,所以通常被称为无损音频。但是严格意义上来讲,WAV也可以存储其它压缩格式的音频数据。2、WAV文件格式 WAV符合RIFF文件格式标准,可以看作是RIFF文件的一个具体实例。既然WAV符合RIFF规范,其基本的组成单元也是chunk。一个WAV文...
ARM公司与芯片 ARM公司是一家知识产权(IP)供应商,它与一般的半导体公司最大的不同就是它不制造芯片并且不向终端用户出售芯片,而是通过转让设计方案,由合作伙伴生产出各具特色的芯片。ARM公司利用这种双赢的伙伴关系迅速成为了全球性RISC微处理器标准的缔造者。这种模式也给用户带来了巨大的好处,因为用户只需要掌握一种ARM内核结构及其开发手段,就能够使用多家公司相同ARM内核的芯片。ARM处理器在性能,成本与功耗之间的平衡,是ARM处理器的亮点。在智能家居、物联网、平板电脑、多媒体数字、汽车电子、医疗电子等领域ARM处理器具有统治地位...
CPU:STM32F429IGT6对于其他的stm32芯片或者其他ARM Cortex-M芯片,其实解决方法都相通。建议先完整阅读了本文之后,再对照着你所遇到问题的现象进行调试。1.基础知识 在ARM Cortex-M系列处理器中,有若干个系统异常专用于 fault 处理。CM3 中的 Faults 可分为以下几类:(1).总线 faults;(2).存储器管理 faults;(3).用法 faults;(4).硬 fault;1.1.总线 faults当 AHB 接口上正在传送数据时,如果回复了一个错误信号(error response),则会产生总线faults,产生的场合可以是:(1).取指,通常被称作“预取流产”(prefetch abort);(2).数据读/写...
1、基础知识 整个硬盘上一般有很多的盘片组成,沿着盘片半径的方向被划分成了很多同心圆,这就是磁道,每条磁道由很多的扇形区域组成,叫做扇区(扇区是从磁盘读出和写入信息的最小单位,通常大小为512字节),不同盘片上的同半径磁道组成了柱面,这些都是磁盘物理上的概念,知道便可。有了这些概念,便可以计算磁盘的容量:磁盘容量 = 磁头数x磁道(柱面)数x每道扇区数x每扇区字节数磁头(head)数:每个盘片一般有上下两面,分别对应1个磁头,共2个磁头,因此,用哪个磁头就可以表示数据在哪个磁面;磁道(track)数:磁道从盘片外圈往内圈编号0磁...
C语言中没有直接获取文件长度的接口,但是我们可以使用标准库提供的函数来间接的获取文件长度。这里提供两种方法。使用C标准库获取文件长度 不论你使用的是哪个操作系统,只要该操作系统支持C标准库,那么就可以通过下述代码获取文件长度:#include <stdio.h>/** * @brief 获取文件长度 * * @param file_name 文件名(包含路径) * * @return -1:获取文件长度失败 其他值:文件长度 * * @version * 1, 2023-08-09, AilsonJack, Created function */long get_file_len(const char *file_name){ FILE *filep; ...
今天给大家讲讲约瑟夫问题是什么,并且我提供了一种约瑟夫问题的解决办法。对于不知道约瑟夫是谁的人来说,就更不用提什么是约瑟夫问题了。那么问题来了,约瑟夫是谁,约瑟夫问题又是个什么东西。首先来个解释吧,约瑟夫问题,有时也称为约瑟夫置换,是一个出现在计算机科学和数学中的问题。特别是对于学习过数据结构的人来说,在书上看到解决这个问题的题目,可能都不下5遍吧。在计算机编程的算法中,类似的问题又称为约瑟夫环或者丢手绢问题。约瑟夫(Josephus)是谁,约瑟夫是著名的犹太历史学家,那么约瑟夫问题又是个什么东西呢。其实我并不太清...
有时候在编写word文档时,插入一个表格后,需要在表格前面添加一个空行,我之前的做法是将表格向下移动来达到增加空行的目的,这种方法其实并不是很好,下面介绍一个在表格前面快捷添加空行的方法。创建表格 首先,新建一个word文档,然后在文档中将表格插入到文档的最开始位置,操作结果如下图所示:2019-02-19_1600572019-02-19_160253在表格前面添加空行 从上图中可以看出,新增加的表格从第一行开始,此时我们需要在表格前面添加一个空行。具体操作步骤为:首先,将光标放在表格第一行的任意位置:2019-02-19_160707接着按键盘上的ctrl+shift+en...
本文将在Ubuntu 22.04上搭建ftp服务器,对于其他版本Ubuntu系统或者其他系列的Linux发行版,配置都差不多。下述内容配置好了匿名用户和Ubuntu本地用户登录ftp服务器,并能上传和删除文件。安装vsftpd sudo apt install vsftpdvsftpd服务在安装完成后会自动启动。通过下述命令可以查看vsftpd的状态:sudo systemctl status vsftpdSnipaste_2023-05-07_16-14-31配置vsftpd 可以通过编辑/etc/vsftpd.conf文件来配置vsftpd服务器。大多数ftp配置在配置文件中都有描述。有关所有可用选项,可以官方vsftpd页面进行查询。执行下述命令打开/etc/vsftpd...