51单片机中断的调用寄存器组(PSW)的作用,以及汇编堆栈的作用,堆栈指针的SP的使用方法,RAM的运行和ROM在单片机具体运行和C语言的优势和中断,定时器基础知识(上)

2023-05-16

一,堆栈在汇编的作用,以及PUSH ACC 和 PUSH PSW

 

  • 通过最简单的8051单片机RAM的分配可知,单片机从烧程序到达到一定的工作过程。首先明白为什么要引如“烧”写的过程 。我们知道一般我说存储器ROM和RAM。首先ROM内存大,保存数据时间长,但这样也限制了ROM不能做到随时随写,因为为了达到内存大,存储更多逻辑,还要长期保存,其芯片设计目前不能达到随时改逻辑。
  • 于是RAM孕育而生,RAM的功能就是随便写,随便读,各个部分的高低电平(就是硅晶体电子上浮下移)——逻辑结构可以根据处理器(内核)不断的修改,处理速度块。
  • 为了完成固定保存逻辑,又要可以随时改变逻辑,就形成了ROM存程序,存表格数据,而RAM存数据,就是CPU(处理器)根据一行行(各个地址)要求,在RAM执行相应的操作。
  • 那么问题来了,RAM是怎样保存运行ROM的程序,以及CPU怎样在ROM得到逻辑识别作用RAM?

这就是RAM有特殊功能区,如上图,在8051单片机中,RAM有516个单元存储(也就是寄存器),ROM存储的程序就是调用RAM的各个寄存器完成逻辑。

比如 :在ROM存储  MOV A, #20H

                                 MOV P1, A

就是ROM发给CPU要给ACC寄存器(ACC其实就是标识符在RAM的位置高128位FSR(特殊功能寄存器)的地址0EH赋值,然后把RAM的ACC(地址E0H)赋值给P1,这里P1也是RAM寄存器(存储单元)存储位置的标识符在90H。

  • 那么问题来了,堆栈SP有什么作用?
  • 首先讲栈的作用;

堆栈就是在执行PUSH ###,把它压倒栈里,把数据保存起来,(注意这里一切都在RAM里面完成),就是在RAM开辟一段空间,当压入时,就是把压入的值赋给栈的寄存器(注意RAM所有地址都叫寄存器)

例如:MOV 30H,#22H

           PUSH 30H

          MOV 30H,#01H

               /%%%MOV A ,30H

        POP  30H

  MOV  A, 30H

如上程序,第一段就是把22h的16进制数存到地址为30H寄存器(寄存器上,其实像 P1,TCON,TMOD,都是RAM寄存器的标识符,他们都表示地址,这里30H是用户自定义区,在汇编编译器没有赋值标识符,当然高手就是直接可以调用头文件直接把每个位置附上标识符),然后执行PUSH 30H,就是把RAM30H单元存储的值(22H)放在栈里,,之后,在对地址30H赋值01H,在“////%%%"A的值为01H,之后再POP 30h,,这里POP只是标记弹出在最后压栈的数据,给30H,也就是30H存储值又恢复22H。

以上就是堆栈的功能(默认都学过C语言,栈是先进后出,在51压栈指针增)

  • 那么问题来了,堆栈是在什么地方堆栈?

这就引出今天讲的重点,堆栈指针SP,指针就是告知对于压入的数据和调用子程序的开始地址和中断时程序运行的地址。但是在RAM中像什么通用寄存器,用户自定义区,可位寻址区,特殊寄存器区,其实没有什么界限,原理上堆栈开始位置可以设置任何区域。但但但是,不要覆盖我们可能要用的寄存器(RAM地址)。

在8051单片机中,栈的默认位置为07H,通过以上RAM地址可以看到,在07H寄存器以上又其他通用寄存器,和位寻址寄存器,用户自定义寄存器。如果当启动中断,调用子函数,或者压栈,栈会保存地址信息,保存压栈的内容,这是原来在(注意当栈确定位置时,压栈数据存储在储存位置上个,如栈起始为07H,进栈存储在08H),08H,09H,的数据就会被覆盖,当调用08H,09H的数据原来数据就没有了,会造成程序紊乱。

所以这也是汇编的弊端,在C语言写程序不管调用多个程序,多个子程序,多少中断,C语言会自动分配合适的栈地址,所以C语言,甚至高级语言基本没有调用栈的程序。(例如在我们学习C语言,老师就讲递归的害处,因为递归是从后往前算,当要得到一个值,要找前面的值,每调用一次,函数的地址就要压栈,当调用多次,把栈的范围扩大到本程序要用的地址(如特殊功能寄存器),就会造成程序崩溃)。

但是在我们单片机汇编语言中,我们是面向寄存器的语言,要时刻关注各个寄存器运行情况。下面来举几个具体的例子。

举例:堆栈SP和RAM

   MOV    A,  #00H
  SETB    RS0
  CLR      RS1  //启用通用寄存器第1组,这时R0的地址为08H

  MOV   R0, A
  MOV   30H, #0FFH  //给用户自定义区30H,赋值为FFH
  MOV   31H, #0EEH  //给用户自定义区30H,赋值为EEH
  PUSH   30H   //把30H的值压倒栈,这里是默认07H为栈的初始位置,在07H,这样08H的值为FFH
  PUSH   31H   // 把31H的值压倒栈,这里是默认07H为栈的初始位置,
                     //因为之前已压一个在07H,这样08H的值为EEH
   POP    30H  //表示弹出栈口的值,给地址30H,因为栈是先进后出,30H地址存储EEH
   POP    31H//同理31H地址的值为FFH
   MOV  A, R0  //最后由于之前进栈操作把原来R0的值覆盖,得到现在R0的值为FFH

之前的C语言,定义unsigned char u;就是编译器在RAM已经生成个存储u的数据,我们不用管,在调用子函数,中断函数,也是C语言已经设置好了堆栈空间,存储函数入口地址。

现在,在汇编,我们经常会遇到修改栈指针就是修改进栈地址,防止我我们设置的寄存器的影响。

汇编模板 

ORG  0000H
AJMP MAIN
ORG  0030H //在40H开始写程序,因为在0000H-0030H的ROM有中断入口
MAIN:

   MOV SP ,#50H  //现在使用的单片机的RAM有很大空间,目前我写函数时直接修改栈地址50H
                            //这样在30H-50H,我可以随意赋值,且不会覆盖,如:MOV 3FH,#0FFH
                             //对于改栈指针最好在主函数执行第一个改

   MOV  30H,  #00H  //首先这个程序存储在ROM中,//
                                 //然后这个程序执行的任务就是把RAM的30H寄存器(地址)赋值00H
   MOV  31H,  #00H
   MOV  32H,  #00H
   CLR    RS0
   CLR    RS1         //调用通用寄存器组0
   MOV  A,     30H
   MOV  R0 ,#31H
   MOV  A, @R0
   ACALL DELAY500MS   //把子函数调用开始位置数据压倒栈里

//注意调用子函数,特别是含有通用寄存器,或者SFR,要想到会不会对主函数有影响
//保险起见,对于封闭的子函数都调用通用寄存器3,主函数都调用通用寄存器组0
DELAY500MS:   
   SETB RS0
   SETB  RS1  //调用通用寄存器3

    MOV R7,#17H
DL1:
    MOV R6,#98H
DL0:
    MOV R5,#46H
    DJNZ R5,$
    DJNZ R6,DL0
    DJNZ R7,DL1
   CLR    RS0
   CLR    RS1   //调用通用寄存器组0

    RET

二,中断和定时器的基础知识

2.1中断

在看逻辑图和寄存器映射编写自己的程序是要注意两点:1,逻辑关系走向,2,寄存器是否可以位寻址。

CPU在正常执行程序的过程中,由于某种已经预见到的外部或CPU内部事件的发生,使CPU暂停执行当前的程序,而去处理临时发生的事件,在事件处理完毕后,再返回原先暂停的程序继续向下执行,这个过程叫做中断(Interrupt)。

编者按:下图是51系列的中断(在我们现在大部分是STC89C52,它又加了额外的中断和优先级(但兼容51),这里就不详细描述,具体可以根据数据手册的流程图配置)这里讲解中断定时器,以及配置都是根据以下的逻辑图和他们对应的寄存器(当然如果可以位寻址,可以根据逻辑图直接配置,问题是有的寄存器不能位寻址)

由图可知,80C51单片机的5个中断源分别是:2个外部中断(由ND、xn引脚输入中断请求信号)、2个片内定时器/计数器溢出中断(TO、T1)和1个片内串行口中断。TCON、SCON是用来存放各中断源的中断申请标志的寄存器;IE是用来设置是否允许中断源中断的寄存器;IP是用来设置中断源优先级别的寄存器;硬件查询是相同优先级的中断源再进行排队的硬件电路。
TCON、SCON、IE和IP是与中断相关的寄存器,下面分别对这4个寄存器的用法进行详细介绍。 

1定时器控制寄存器TCON(Timer ControlRegister)。

TCON为定时器/计数器TO、T1的控制寄存器,同时也锁存了TO、T1的溢出中断和2个外部中断请求的标志位。TCON的单元地址为88H,可位寻址,这些中断请求标志位可以用软件查询。TCON的格式及与中断有关的位的功能如下。
 

 上面的逻辑图,可以地IE1,IE2,IT1,IT0,分别是中断请求标志位,都可以在完成中断自动清零。

3串行口控制寄存器SCON(Serial ControlRegister)。

SCON的低两位锁存了串行口发送中断和接收中断请求标志位。SCON的单元地址为98H,可位寻址。SCON的格式和与中断有关的位的功能如下。(由上章串口通信,这里SCON是一部分)


TI:串行口发送中断请求标志位。当串行口发送完一个数据帧时,将TI置位(TI=1),向CPU申请中断。
RI:串行口接收中断请求标志位。当串行口接收完一个数据帧时,将RI置位(RI=1),向CPU申请中断。 

 注意在串口中断时,中断标志位不能自动清零(也就是术语:硬件清零),在编程时跳到中断要清零(软件清零)。

4中断允许寄存器IE(Interrupt EnableRegister)


对于各个中断源的中断允许控制位,当其为1时,允许中断;当其为0时,禁止中断。中断允许寄存器IE的单元地址是0A8H,各控制位(位地址为0A8H~0AFH)可位寻址,故用户既可以用字节传送指令又可以用位操作指令来对各个中断请求加以控制。画×的位未用到,可设置为0。

EA:中断允许总控制位。若EA=0,则所有中断源的中断请求均被禁止;若EA=1,则所有中断源的中断请求均被允许,但中断请求最终能否被CPU响应,还取决于IE中各中断源的中断允许控制位的状态。EX0和EX1:EX0为外部中断0的中断允许控制位;EX1为外部中断1的中断允许控制位。
ETO和ET1:ETO为定时器/计数器TO的溢出中断允许控制位;ET1为定时器/计数器T1的溢出中断允许控制位。
ES:串行口中断允许控制位。
 

5中断优先级寄存器IP(Interrupt Priority Register)


CPU在某一时刻只能响应一个中断源的中断申请,如果有很多的中断源同时申请中断,到底应该响应哪一个呢?可以通过设定优先级别的方法来解决这个问题。80C51单片机的5个中断源,均可由程序设置为高优先级中断或低优先级中断,谁的优先级别高,就先响应谁。每个中断源的中断优先级都通过中断优先级寄存器IP统一设置。IP的格式和与优先级设置有关的位的功能如下。

PX0和PX1:PX0是外部中断0的中断优先级控制位;PX1是外部中断1的中断优先级控制位。
PTO和PT1:PTO为定时器/计数器TO的溢出中断优先级控制位;PT1为定时器/计数器T1的溢出中断优先级控制位。
PS:串行口中断优先级控制位。
当某个中断源的优先级控制位为1时,设置为高优先级中断;为0时,设置为低优先级中断。IP的单元地址为0B8H,各控制位(位地址为0B8H~0BCH)可位寻址,故用户既可以用字节传送指令,又可以用位操作指令来对各个中断源的优先级进行设置。单片机复位时,IP=00H,即所有中断源为低优先级中断。

6中断的处理过程


中断的处理过程大致可分为4步:中断请求、中断响应、中断处理和中断返回。
1.中断请求
当中断源发出中断请求时,将相应的中断请求标志位置“1”,向CPU请求一次中断服务。如果中断允许寄存器IE中的总控开关和相应的分控开关是闭合的,那么这个中断标志位就会传送到CPU中。
2.中断响应
CPU响应中断时,先置位相应的优先级状态触发器,指明CPU开始处理的中断源的优先级别,以屏蔽后面的同级或低级中断请求;然后自动清除相应的中断标志(TI或RI除外);最后再执行由硬件自动生成的长调用指令(LCALL),该指令将程序计数器PC的内容(主程序被中断的地址,也称断点地址)压入堆栈保护起来,再将对应的中断服务程序的首地址(也称中断入口地址或中断矢量地址)装入程序计数器PC,使CPU去执行中断服务程序。注意,断点地址被压入堆栈保护起来了,但对诸如PSW、累加器A等寄存器的数据并没有保护,需要时可在中断服务程序中完成保护任务。系统规定的各中断源相对应的中断服务程序的中断入口地址见



ORG 0003H ;外部中断0的中断入口地址
AJMP  EXT0 ;转移到0200H单元

 

7代码示例端(注意通用寄存器的改变): 

通过这个基础设置,也就是更具逻辑图,以及寄存器(可位寻址与不可位寻址)可是自行设计中断,这里就不详细描述了,我所讲的还是跟上个一样,就是调用子函数的通用寄存器的改变,以及中断的改变,如下示例,就是简单的外部中断0,下降沿有效。实验证明在PUSH PSW ;只是保存程序状态字,如保存通用寄存器组,但是当在中断仍然改变通用寄存器的值,它还会对主函数造成影响,原来不管中断还是调用子程,默认都是调用通用寄存器组0,为了避免影响,在汇编的子程序开始修改组别,调用末尾在改回来。在C语言有个interupt using 1; 就是调用通用寄存器组1.

LED EQU P2
ORG 0000H
AJMP MAIN
ORG 0003H  //中断的处理过程:2.中断响应之外部中断0的地址,必须要这样的格式
AJMP EXT0
ORG 0040H  //因为我用的是stc52系列
MAIN:
SETB IT0   //1定时器控制寄存器TCON(Timer?ControlRegister)。设置下降沿有效
SETB EX0  //4中断允许寄存器IE(Interrupt?EnableRegister) 开中断0
SETB EA   //4中断允许寄存器IE(Interrupt?EnableRegister) 最高级控制所有中断
SETB PX0    
MOV A,#01H
CLR RS0
CLR RS1
MOV R7,#0FH

LOOP:
      ;CPL A
      ;MOV LED,A   //连接方式灌电流,电源-电阻-二极管-Px,低电平亮
	  ;ACALL DELAY800MS
	  MOV LED,R7                                           //用于检验
	  ;;ACALL DELAY800MS
	  ;RL A
	  AJMP LOOP  //没有中断的LED
	  
EXT0:   //中断处理程序
     PUSH PSW
	 PUSH ACC
	 ;SETB RS0
	 ;SETB RS1   /////////修改寄存器
     MOV R7,#0F0H
	 MOV LED,R7                                           //用于检验
	 ;ACALL DELAY1S
     ;ACALL DELAY1S
	 POP ACC
	 POP PSW
	 CLR RS0
	 CLR RS1
	  RETI



DELAY1S:   ;误差 0us
    MOV R1,#0A7H
DL11:
    MOV R2,#0ABH
DL00:
    MOV R3,#10H
    DJNZ R3,$
    DJNZ R2,DL00
    DJNZ R1,DL11
    NOP
    RET

DELAY800MS:   ;误差 0us
    MOV R4,#5FH
DL1:
    MOV R6,#8AH
DL0:
    MOV R5,#1DH
    DJNZ R5,$
    DJNZ R6,DL0
    DJNZ R4,DL1
    NOP
    NOP
    RET	  
	END

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

51单片机中断的调用寄存器组(PSW)的作用,以及汇编堆栈的作用,堆栈指针的SP的使用方法,RAM的运行和ROM在单片机具体运行和C语言的优势和中断,定时器基础知识(上) 的相关文章

  • 2023年3月计算机三级网络技术备考

    一 专项练习 网络系统结构与设计的基本原则 1 1基础知识 1 1 1 广域网技术的发展 下列关于光以太网技术特征的描述中 xff0c 错误 的是 A 能够根据用户的需求分配宽带 B 以信元为单位传输数据 C 具有保护用户和网络资源安全的认
  • Vue3项目使用 wow.js 让页面滚动更有趣~

    wow js是一个可以在页面滚动的过程中逐渐释放动画效果 xff0c 让页面滚动更有趣的一个插件库 官网 xff1a wow js Reveal Animations When Scrolling 本文就演示一下如何在Vue3项目使用 wo
  • Failed to start bean ‘documentationPluginsBootstrapper ‘; nested exception is java.lang.NullPointer

    在配置使用swagger的时候启动报错 xff0c 如下 xff1a 原因在于我在swagger配置里加上了 64 EnableSwagger2注解 xff0c 在加上它之前可以正常启动 解决方法 xff1a 在配置文件里加上 spring
  • 串口发送float类型数据

    STM32串口发送float类型数据 一 代码 1 发送 span class token keyword void span span class token function send gyro span span class toke
  • STM32 F4串口空闲中断 + DMA实现数据发送

    STM32 F4串口空闲中断 43 DMA实现数据发送 前言文章目录一 空闲中断二 DMA三 代码部分1 串口配置2 DMA配置 前言 最近在做 STM32 43 ROS车的项目 xff0c STM32与ROS之间通信由于数据量大 xff0
  • Darknet YoloV4编译+训练(避免踩坑)

    AlexAB darknet yolov4编译 43 训练 时间间隔好几天今天来更新一下yolov4的训练 训练篇 在训练之前需要对大佬的源码进行编译本本机编译 xff0c 编译过程可查看下述链接 xff1a https blog csdn
  • ubuntu下如何创建ros工作空间、创建ros功能包、创建ros节点

    1 打开终端进入存放ros工作空间的目录 xff08 比如我这里将它放在home目录下的test文件夹中 xff09 cd test 2 开始创建ros工作空间 mkdir p catkin ws src cd catkin ws src
  • STM32串口通信 (采用链表接收不定长数据帧)

    STM32串口通信 链表接收不定长数据帧 数据帧说明不太恰当的比方 数据缓冲链表结构效果展示工程文件 数据帧说明 STM32数据寄存器为USARTx gt DR寄存器 可以看到DR寄存器只有 8 0 位可以使用 xff0c 第8位用于奇偶校
  • A*寻路算法

    目录 1 动画演示2 游戏中的自动寻路A 算法3 A 寻路算法原理4 调试代码分析代码5 代码 1 动画演示 2 游戏中的自动寻路A 算法 随着3D游戏的日趋流行 在复杂的3D游戏环境中如何能使非玩家控制角色准确实现自动寻路功能成为了3D游
  • 2022数学建模国赛B题和C题高质量论文代码数据

    目录 B题论文 5 1 问题一的建模与求解 5 1 1 使用极坐标求解具体位置 C题论文 1 1 研究背景 1 2 问题的提 5 1 问题一的建模与求解 5 1 1 数据的预处理 B题论文 5 1 问题一的建模与求解 5 1 1 使用极坐标
  • stm32小白学习之寄存器名称

    IDR输入只读寄存器 xff0c ODR输出可读可写寄存器 BSRR xff08 置位寄存器 xff09 与BRR xff08 复位寄存器 xff09 CRL xff08 端口配置低位寄存器 xff09 与CRH xff08 端口配置高位寄
  • 使用Vite创建Vue3+TS项目并整合Element Plus框架等一条龙服务

    记录一下使用Vite创建Vue3 43 TS项目以及整合Element Plus框架 xff0c 还有Less Pinia Vue router monaco editor等插件或组件 一 使用Vite创建Vue3 43 TS项目 第一步
  • Qt学习 第37节:QString

    在阅读QString文档时 xff0c 出了一个词 implicit sharing copy on write xff0c 不是很懂 xff0c 下面链接解释的表明白 QT的隐式共享 Implicit Sharing 道路与梦想 CSDN
  • 下载Postman并且汉化使用

    下载Postman并且汉化使用 一 下载postman postman有不同的版本 xff0c 如果要汉化就要下载的版本与汉化包一致 下载地址 xff1a postman官网下载地址 xff1a https www postman com
  • 【Vue】postman汉化教程 保姆级教程 包教会

    下载链接 xff1a Win64 Win32 历史版本下载 请把下面链接的 34 版本号 34 替换为指定的版本号 xff0c 例如 xff1a 8 8 0 版本链接Windows32位https dl pstmn io download
  • 操作系统实验——进程与线程

    目录 1 使用GCC xff08 1 xff09 参数 xff08 2 xff09 自定义头文件 xff08 3 xff09 makefile脚本 xff08 4 xff09 gdb调试 2 进程 xff08 1 xff09 新建进程 xf
  • 串口应用(USART)

    串行口应用 1 USART介绍 通用同步异步收发器 USART 提供了一种灵活的方法与使用工业标准NRZ异步串行数据格式的 外部设备之间进行全双工数据交换 USART利用分数波特率发生器提供宽范围的波特率选择 它支持同步单向通信和半双工单线
  • cpp-httplib 避免阻塞主线程, c++封装httplib,httplib面向对象开发

    目录 说明 前言原生的httplib会阻塞你的主线程解决httplib阻塞主线程的问题BashController 面向对象风格使用httplib自定义controller MyController h文件自定义controller Tes
  • 数据结构——结构体的5种定义方式及对比

    以下仅为定义结构体的方式 xff0c 具体使用在后续的文章中介绍 span class token macro property span class token directive hash span span class token d
  • 【C++】STL应用(详解)

    一 泛型程序与STL1 泛型程序设计的基本概念2 STL简介 二 迭代器1 输入流迭代器2 输出流迭代器 三 STL应用1 撰写自己的算法和函数 xff0c 结合容器和迭代器解决序列变换 xff08 如取反 平方 立方 xff09 xff0

随机推荐

  • 模块学习(二)——MPU6050

    去年电赛备赛期间 xff0c 学的STM32标准库 xff0c 那一整个繁琐直接给我劝退了 xff0c 当时学习MPU6050时就非常痛苦 xff0c 代码也看不懂 xff0c 无非抄来抄去 xff0c 然后就是编译 xff0c 改错 xf
  • 【嵌入式面试题】常见的面试题梳理一

    注 xff1a 看面试题时 xff0c 主要应该以学习为主 xff0c 面试题有些基本上是我们编程时会遇上的问题 xff0c 通过学习面试题会提升我们的编程意识和解决一些日常我们编程所遇到的问题 xff0c 看完这篇面试题后 xff0c 希
  • 使用Python+openpyxl实现导出自定义样式的Excel文件

    之前项目中的导出Excel文件操作都是在前端完成的 xff0c 项目是由vue 43 vite构建的 xff0c 效果还不错的 xff0c 所需依赖包如下所示 npm i xlsx 64 0 18 5 npm i xlsx style vi
  • 【嵌入式面试题】常见面试题梳理二

    注 xff1a 看面试题时 xff0c 主要应该以学习为主 xff0c 面试题有些基本上是我们编程时会遇上的问题 xff0c 通过学习面试题会提升我们的编程意识和解决一些日常我们编程所遇到的问题 xff0c 看完这篇面试题后 xff0c 希
  • 【嵌入式面试题】常见面试题梳理三

    注 xff1a 看面试题时 xff0c 主要应该以学习为主 xff0c 面试题有些基本上是我们编程时会遇上的问题 xff0c 通过学习面试题会提升我们的编程意识和解决一些日常我们编程所遇到的问题 xff0c 看完这篇面试题后 xff0c 希
  • 【嵌入式面试题】常见面试题梳理四

    注 xff1a 看面试题时 xff0c 主要应该以学习为主 xff0c 面试题有些基本上是我们编程时会遇上的问题 xff0c 通过学习面试题会提升我们的编程意识和解决一些日常我们编程所遇到的问题 xff0c 看完这篇面试题后 xff0c 希
  • 【嵌入式面试题】常见面试题梳理五

    注 xff1a 看面试题时 xff0c 主要应该以学习为主 xff0c 面试题有些基本上是我们编程时会遇上的问题 xff0c 通过学习面试题会提升我们的编程意识和解决一些日常我们编程所遇到的问题 xff0c 看完这篇面试题后 xff0c 希
  • 【嵌入式面试题】常见面试题梳理六

    注 xff1a 看面试题时 xff0c 主要应该以学习为主 xff0c 面试题有些基本上是我们编程时会遇上的问题 xff0c 通过学习面试题会提升我们的编程意识和解决一些日常我们编程所遇到的问题 xff0c 看完这篇面试题后 xff0c 希
  • 我的创作一周年纪念日--收获与成长与展望

    机缘 2022年10月11日 xff0c 是我创作的一周年纪念日 xff0c 1年前 xff0c 刚到大三的我开启了我的创作之旅 xff0c 那个时候 xff0c 我选择重新学习C语言和数据结构 xff0c 将我的基础在进行巩固 在那个时候
  • 【Linux】特别篇--SMBus 协议

    Linux 特别篇 SMBus 协议 一 SMBus 简介二 SMBus 与 I2C 区别三 SMBus协议分析3 1 符号含义3 2 SMBus Quick Command3 3 SMBus Receive Byte3 4 SMBus S
  • 【Linux】特别篇--GNU C编译器扩展语法

    前言 xff1a 本章是我参考 嵌入式C语言自我修养 的GUN C编译器扩展语法这一章 xff0c 对其中的内容进行了摘录 总结与归纳 xff0c 并写了一些关于自己的理解 xff0c 这边还是推荐大家去购买原作的 xff0c 因为里面用通
  • 【ROS】机械人开发一--树莓派安装ubuntu18.04

    前言 xff1a 安装了一天的树莓派系统 xff0c 遇到了很多坑 xff0c 这里将教程详细分享一下 xff0c 方便大家快速的安装系统 目录 一 操作环境硬件软件 二 资源下载链接三 具体步骤烧入修改镜像文件问题修改重启时间PC端使用x
  • 【ROS】机械人开发二--ROS环境安装

    机械人开发二 ROS环境安装 一 运行环境二 ROS melodic安装2 1 设置软件源2 2 设置密钥2 3 安装ROS2 4 环境设置2 5 安装ROS的依赖环境2 6 初始化rosdep 三 建立工作空间测试 一 运行环境 树莓派4
  • Android应用程序开发期末大作业(1)

    一 简答题 每小题5分 xff0c 4小题 xff0c 共20分 1 1 android大众常用的五种布局 xff08 5分 xff09 答 xff1a FrameLayout 框架布局 xff0c LinearLayout 线性布局 xf
  • 【ROS】机械人开发三--ROS工作空间与功能包

    机械人开发三 ROS工作空间与功能包 一 ROS工作空间1 1 概念1 2 创建工作空间1 3 编译工作空间1 4 设置环境变量1 5 添加环境变量 二 功能包2 1 概念2 2 功能包的内容2 3 创建功能包 三 CMakeLists t
  • 【ROS】机械人开发四--ROS常用概念与Launch文件

    机械人开发四 ROS常用概念与Launch文件 一 ROS常用概念1 1 ROS 的结构1 2 ROS 话题通信1 3 海龟仿真器 仿真 例程 二 Launch文件2 1 功能2 2 文件语法2 3 参数服务器2 4 节点分组与重命名标签
  • 【ROS】机械人开发五--ROS基本概念的程序实现

    机械人开发五 ROS基本概念的程序实现 一 开发工具二 RoboWare Studio的基本使用2 1 软件启动2 2 修改界面语言2 3 使用2 4 编译文件2 5 卸载 三 话题通信四 话题的代码编写4 1 发布端4 2 接收端4 3
  • 【STM32】标准库与HAL库对照学习教程十四--CAN总线

    STM32 标准库与HAL库对照学习教程十四 CAN总线 一 前言二 准备工作三 CAN协议3 1 简介3 2 CAN物理层3 2 1 闭环总线网络3 2 2 开环总线网络 3 3 差分信号3 3 1 简介3 3 2 CAN总线上的差分信号
  • 【CANopen】CANopen总线讲解

    CANopen总线 一 前言二 CANopen概述2 1 CANopen网络模型2 2 CANopen常见规范 三 CANopen对象字典四 CANopen通讯标识符五 CANopen协议概述5 1 CANOpen协议报文分类5 2 CAN
  • 51单片机中断的调用寄存器组(PSW)的作用,以及汇编堆栈的作用,堆栈指针的SP的使用方法,RAM的运行和ROM在单片机具体运行和C语言的优势和中断,定时器基础知识(上)

    一 xff0c 堆栈在汇编的作用 xff0c 以及PUSH ACC 和 PUSH PSW 通过最简单的8051单片机RAM的分配可知 xff0c 单片机从烧程序到达到一定的工作过程 首先明白为什么要引如 烧 写的过程 我们知道一般我说存储器