嵌入式计算机系统之软件
文章平均质量分 65
嵌入式软件
tuxinbang1989
嵌入式计算机控制系统开发者。
展开
-
负数在计算机中的存储——补码
首先,负数要在计算机中正确存储,其对应变量必须声明为有符号数。有符号数的最高位为符号位:0代表正数,1代表负数;后面的位则为数值位。现在来研究一个简单的负数-1在一个字节(8位)中的存储。按照一般理解,-1在计算机中应该为 1000 0001:最高位为符号位1,后面是数值1,这样的形式类似于十进制的数学表示。如果这时我们想做一个加法运算:2+-1=1人的大脑很容易进行求解,但计算机这不一定。 按照这种类十进制数的编码方式,2在计算机中的表示为0000 0010,若直接进行加法...原创 2021-06-26 00:33:36 · 3634 阅读 · 1 评论 -
UCOSIII总结(3)——在C28x中任务切换
1.概述UCOS的任务切换是当前任务在系统延时函数OSTimeDly()或OSTimeDlyHMSM()中进行的;延时函数调用任务调度函数OSSched(),调度函数通过软件触发RTOSINT中断函数来完成任务切换。2.任务切换步骤:①保存当前任务(进程)对应的CPU寄存器值至该任务的栈空间中。②保存当前任务的SP(栈指针寄存器)值到它的TCB变量中:OSTCBCurPtr->OSTCBStkPtr = SP;③调用OSTaskSwHook()钩子函数。④从就绪列表中得到原创 2021-06-24 01:01:57 · 588 阅读 · 0 评论 -
嵌入式软件从编码到发布的过程
文章内容是对软件项目从编码到发布整体框架的简要介绍,可以给我们排查解决代码编译bug提供方向。一个应用软件,从源代码到最后的可执行文件,中间经历了如下几个过程:中间过程会有反复,但总体流程如此。在这个过程中,需要用到编辑器、文件管理器、编译器、调试器和打包工具(可选),对于大型工程,还要用到CMAKE(或类似工具)作为自动生成Makefile的辅助工具。最原始的编写应用软件的方式是编辑器(editor)、编译器(compiler)和调试器(debugger)是分离的,所以在编译和调试代码原创 2021-06-09 23:19:17 · 389 阅读 · 2 评论 -
RT-Thread——线程管理
1.线程的概念 线程可以理解为一个个相互独立运行的单元任务。这些任务共同使用CPU和内存空间等系统资源,不过,每一时刻,只能有一个线程在运行。 各个线程的运行是相互独立,不断切换的,所以线程都要有自己的堆栈,从而再次运行时能够恢复运行环境。2.线程的调度RT-Thread提供的线程调度器是基于优先级的全抢占式调度,但中断函数和临界段程序是不可抢占的。系统总共支...原创 2019-08-31 22:49:08 · 2061 阅读 · 0 评论 -
RT-Thread消息队列(message queue)的使用
1.消息队列的概念和特性消息队列,顾名思义,就是多条消息排成的队列,是线程间或线程与中断间传送信息的数据结构,且长度不固定。特性:①消息队列遵循先进先出原则(FIFO),即线程先得到的消息是先进入消息队列的消息;而且,等待消息的线程优先级最高的首先获得消息。②一个线程可以从任意一个消息队列接收和发送信息;多个线程也可以从一个消息队列接收和发送信息。③能发送紧急消息,紧急消息是往队列头发送...原创 2019-08-29 23:59:22 · 3546 阅读 · 1 评论 -
RT-Thread使用注意事项(一)
1.硬件的初始化硬件的初始化和RTT系统初始化已经在main函数之前完成,即在component.c文件中的rtthread_startup()函数中完成了。 所以在main函数中,只需要创建线程和启动线程即可。2.不同源文件相同变量的引用被外部文件引用的变量要放在头文件中声明,例如main.c要引用board.h中的变量temp,分两步:①在board.h中用extern修饰并定义;...原创 2019-08-14 00:41:18 · 2251 阅读 · 0 评论 -
UCOSIII总结(2)——源码架构
准确理解µC/OS-III的源码,对顺利移植OS、建立应用程序非常有帮助。下面将介绍µC/OS-III源码的架构:ucosiii源码架构示意框图从图中可以看出,与ucOS密切相关的硬件是CPU、定时器和中断控制器,当然,MCU还有其他的外设,在BSP中要用到,只是这里没有列出。除去硬件,整个µC/OS-III源码架构包含9个模块,下面分别予以介绍:⑴应用层模块应用程序代码由项目文件组成。为了方便,这里简单统称为app.c和app.h,事实上应用层可以包含任意数量的文件,而不仅仅只有ap原创 2021-05-19 13:11:48 · 1772 阅读 · 1 评论 -
RTSC:嵌入式软件的组件管理模式
组件技术已成为现代软件工程的支柱,例如最初的C++,到后来天生就支持组件设计与部署的Java与C#。正是由于组件技术的使用,才使得现今的程序更加模块化、可定制裁剪。虽然组件技术在主流的上位机领域取得巨大成功,但在嵌入式这一领域影响甚微,其主要原因是嵌入式系统受到时间、空间和功耗的限制,主流组件技术很难应用。随着嵌入式应用程序复杂度的增加以及对程序可移植性的期望,嵌入式C程序员需要在程序的通用性和性能之间做权衡。通用性往往会降低效率,性能的提升往往难以移植。嵌入式软件的生产者/消费者矛盾:①生产者原创 2021-04-28 15:14:47 · 1306 阅读 · 1 评论 -
C/C 代码风格(仅供参考)
作为一个程序员,代码就代表我们的颜值。好的代码,看起来赏心悦目,读起来易于理解。好的代码要在一定代码量的基础上积累起来,但也要有意识地遵循一定的规范。有几点需要遵循:1.代码总体结构——层次分明,干净整洁1.1 代码结构格式化,包括间隔、多级代码缩进、大括号(比如C系代码)、分号;1.2为了提高代码的美观型和易读性,区间与区间之间最好以一行*或-之类的间距;1.3 合理运用空行。空行...原创 2019-10-24 15:38:47 · 348 阅读 · 0 评论 -
嵌入式系统软件架构浅析
软件架构,就是软件的结构,包含软件元素(模块构件等)、外部接口及其相互关系。1.软件架构的作用做到嵌入式软件的代码逻辑清晰,且避免重复造轮子; 架构设计有利于软件的移植,没有架构,代码混乱,移植将非常痛苦; 能最大限度地复用原有的代码; 使代码高内聚低耦合,维护和修改简单方便。2.设计思路2.1架构风格嵌入式系统软件与硬件联系紧密。首先想到要将硬件的驱动程序和功能应用的程序...原创 2019-10-24 11:26:24 · 8197 阅读 · 0 评论 -
stm32f0x基于HAL库的ADC-DMA采样配置过程
ADC-DMA采样步骤如下:1.准备工作定义宏量和存储采样值的全局变量://采样值数组的元素个数,这里是10个#define ADC_CONVERTED_DATA_BUFFER_SIZE ((uint32_t) 10)//采样值数组全局声明static uint16_t aADCxConvertedData[ADC_CONVERTED_DATA_BUFFER_SIZE];/...原创 2019-10-13 14:16:00 · 2305 阅读 · 0 评论 -
uCOSIII总结(1)——杂项
1.时间管理的作用?时间管理函数实质上是各任务进入调度的入口,表现为各任务按照设定的时钟节拍循环执行。设定不同的延迟时间对任务切换有很大影响:设定延迟时间合理,则程序运行流畅;若设定延迟时间不合理,则各任务调度可能会存在堵塞,程序不能按照设定的功能进行。2.信号量的理解?信号量主要用于共享资源(如硬件外设)的管理和标志事件发生(cnt参数设为0)。信号量是一个数值,对于多值信号量,可以...原创 2018-08-11 09:16:06 · 2635 阅读 · 0 评论 -
STM32CubeIDE使用总结(四)——遇到的问题
1.如何添加自己编写的头文件和源文件如果没有正确添加头文件和源文件,会报类似如下错误:my_header.h: No such file or directory。step1:添加自编头文件的路径选中工程,点击菜单栏Propertise:C/C++ Build -> Settings -> Tool Settings -> MCU GCC Compiler -> I...原创 2019-09-15 15:05:58 · 20204 阅读 · 6 评论 -
STM32CubeIDE使用总结(三)——debug调试程序
这里说明的是调试程序的步骤,所以前提是工程(project)已经编译(Build)成功。首先,调试用的是调试器是ST-LINK V2,如下图所示:1.如果第一次使用Cube IDE,应该需要更新ST-LINK固件在STM32CubeIDE菜单栏“Help->ST-LINK更新” 中更新ST-LINK固件。拔下并重新连接ST-LINK/V2,然后点击"Open in up...原创 2019-09-14 16:00:47 · 62307 阅读 · 12 评论 -
STM32串口收发数据的DMA配置过程
DMA,全称Direct Memory Access,即直接存储器访问, DMA 传输方式无需 CPU 干预,通过硬件为 RAM 和 I/O 设备开辟一条直接传送数据的通路,能大大提高CPU的运行效率。下面介绍stm32单片机的USART和DMA的配置过程:step1:STM32串口配置使用串口初始化函数来配置:void usart_init(void){ //第一步:GPI...原创 2019-09-01 23:08:13 · 2218 阅读 · 0 评论 -
stm32粗延时和精准延时函数
1.stm32粗延时函数粗延时的意思就是延时时间不太准确,一般用在对延时时间要求不严格的场合。这种延时方式是采用软件延时,但因为编译器会在编译的时候加上一些其他辅助指令,所以不能确定C程序的准确运行时间。我们可以采用下面的方法进行估算:假设stm32 MCU系统时钟(SYSCLK)为48MHz,指令周期为4个系统时钟,则一个指令周期时长为1/12微秒。若要让计时单位为微秒(us),则可以...原创 2019-05-02 16:03:46 · 8736 阅读 · 0 评论 -
stm32使用过程中的注意事项(持续更新中)
1.ADC采用值转换成具体的物理量值ADC采样值在寄存器中是16位整形数据,要转换成具体的电压量,则必须进行换算。例如12位的转换精度,满量程的二进制为0000 1111 1111 1111,对应十进制数为1095,对应的电压为3.3V。所以计算公式为 电压 = (采样二进制值/10...原创 2018-09-02 23:31:19 · 1222 阅读 · 0 评论 -
STM32配置一般过程(持续更新中)
1.外设配置顺序RCC时钟→GPIO→其他外设2.外设具体配置过程①配置函数首先声明PPP_InitTypeDef结构体变量。 例:GPIO_InitTypeDef GPIO_InitStructure;②为定义的结构体变量设置需要的值。设置变量中所有的值:PPP_InitStructure.member1 = value1;PPP_InitStructure.membe...原创 2018-08-26 21:54:33 · 3262 阅读 · 0 评论