找回密码
 立即注册
楼主: gentleman

【实验箱已收到】何老师 《STC32位8051单片机原理及应用-STC32G12K128》,打卡

[复制链接]
  • 打卡等级:以坛为家I
  • 打卡总天数:217
  • 最近打卡:2024-11-15 09:12:27

29

主题

722

回帖

2790

积分

荣誉版主

积分
2790
发表于 2023-9-9 15:07:15 | 显示全部楼层
本帖最后由 gentleman 于 2023-9-23 09:01 编辑

2023/09/05 第三十六集
      接上回,继续讲那四个关键字

      _at_   指定变量再决定存储器位置
                单片机特有

     sturct num edata x_at_0x0200;
     这行就把num 放在edata 区域0x0200位置

   
    截图202309091458074170.jpg

    看到watch 窗口的变量的地址

    提到结构体 ,就是一堆变量放一起了

     用的时候可以直接  .  
     
    arm 很多寄存器 都用结构体

    指针


      截图202309091501392063.jpg

      near 指针  huge指针
      寻址范围不同

       指针能强制转换   
       截图202309091505447413.jpg

       截图202309091506036445.jpg

      这些能转,其他非法

   
      
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:以坛为家I
  • 打卡总天数:217
  • 最近打卡:2024-11-15 09:12:27

29

主题

722

回帖

2790

积分

荣誉版主

积分
2790
发表于 2023-9-23 09:17:44 | 显示全部楼层
2023/09/01 第三十一集


      mcs251 程序和数据支持多个物理空间分离的存储空间

      这里脑子里应该出现一张图

      这个c语言比标准c多了一些 表示不同存储空间的  标识符

      计算机系统 中都放在同一物理存储空间  程序--》 sram(cache)

      单片机       不同存储空间 edata  xdata(略慢) code(放程序常数)


      CODE
            64k
            代码空间大
            程序代码
             常熟变量
            标识符 code

             stc32g 最好不用code 用const near 或 const far
            
        DATA  IDATA
              data 前128字节
              idata 256字节
              位寻址  20h开始 16字节
            
               idata 标识符


         data bdata ebdata
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:以坛为家I
  • 打卡总天数:217
  • 最近打卡:2024-11-15 09:12:27

29

主题

722

回帖

2790

积分

荣誉版主

积分
2790
发表于 2023-9-23 09:31:14 | 显示全部楼层
2023/09/01 第三十二集

   
    前面是程序的反汇编分析  


   片内外的 数据存储器  可  R/W


    stc32g 有XRAM
      
      可以有64k 外部数据存储器
                        但可能是外设-----存储器映射IO
                        sfr 80H~FF,   PWM   USB ...


      CPU 访问外设  SFR
                            存储器映射io (XSFR?)
     
      可以写程序  定义上面的这些变量,反汇编看看  到底放在哪里了
      
      near memroy
         00:0000~00:ffff
         edata /econst
          用near 声明      


         截图202309230928124325.jpg            


       far  完整地址范围  16M
       huge  大存储器  16M-1
       SFR   与外设交互
                只能直接访问
        
   


回复 支持 反对

使用道具 举报 送花

  • 打卡等级:以坛为家I
  • 打卡总天数:217
  • 最近打卡:2024-11-15 09:12:27

29

主题

722

回帖

2790

积分

荣誉版主

积分
2790
发表于 2023-9-23 10:06:51 | 显示全部楼层
2023/09/01 第三十三集
         数据类型
               截图202309230950386061.jpg
                截图202309230953567202.jpg

              注意int是16位

         void 无返回值
          int 不同架构 不一样
                  可以加关键字约束
         enum
                  枚举
   
          截图202309230956469283.jpg


              浮点在内存中这么存

     _chkfloat_  允许 快速检查

            union f {
                           float f;
                           unsigned long ul;
                       }

          这里学了一手 可以在调试时用printf 打印变量

         double
                    默认是float 不是double

         位寻址
                  bata/edata
                  位寻址能力很强
                  sfr 特殊
          sfr
                   sfr P0 = 0X80
                   函数体外声明


           sbit
                   ^ 定义位
      
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:以坛为家I
  • 打卡总天数:217
  • 最近打卡:2024-11-15 09:12:27

29

主题

722

回帖

2790

积分

荣誉版主

积分
2790
发表于 2023-9-29 13:40:24 | 显示全部楼层
三十四集到三十六集在前面
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:以坛为家I
  • 打卡总天数:217
  • 最近打卡:2024-11-15 09:12:27

29

主题

722

回帖

2790

积分

荣誉版主

积分
2790
发表于 2023-9-29 14:29:37 | 显示全部楼层
2023/09/08 第三十七集

   定义了个 edata区域 的指针
   指向xdata 区域的变量 a

   查看反汇编  定义变量
                    A5立即数搬到 A
                    DPTR 指针指向 0x0000  (这里dpxl 是0x01段)
                     A 移到DPTR 指向的内存

                     memory窗口 在0x010000 发现立即数A5
               
                    给指针赋值
                    WR6 WR4 复制
                            查看DR4的值就是变量的地址
                   吧DR4 搬到 edata 0x0008位置单元


    通过一个简单的小程序,解释指针在底层是如何实现的


    指针有16位 32位的
    指针指向的是地址


函数
      实参如何传入形参
      返回值如何返回
       截图202309291406398422.jpg
     这里是进入/退出函数 时要保存/退出现场的数据
     
     函数声明格式
       截图202309291408134008.jpg
   
       arm架构里attribute  属性 那行内容更多
   
       reentrant 可重用  被两个引用或递归

       interrupt 中断   这里吐槽一下keil只支持31个中断号,超过就要用拓展工具或用汇编借用其他的中断号

        arm存储器外设统一编址
        
        stc 有一部分是, 其他的在sfr中


       可以根据具体函数内容来选择   small large 模型

       8个寄存器组  --  老朋友了
            处理中断或实时操作系统时很有用
            可以切寄存器组, 不用堆栈
   
       中断函数
             不允许 带有运算符和中断属性的表达式
                   这里写个标志位就行,别放太多东西,消耗寄存器,堆栈
                   ISR-RETI  别记错了
                   中断函数不能通过指针调用
                  
  
                    

回复 支持 反对

使用道具 举报 送花

  • 打卡等级:以坛为家I
  • 打卡总天数:217
  • 最近打卡:2024-11-15 09:12:27

29

主题

722

回帖

2790

积分

荣誉版主

积分
2790
发表于 2023-9-29 14:49:56 | 显示全部楼层
本帖最后由 gentleman 于 2023-9-29 15:06 编辑

2023/09/08 第三十八集

   可重入函数
        递归/多个进程用
        不用用位类型参数
        不能用alien属性
                 -PL/M 函数必须用alien


   外来函数
        RTX51-TINY  现在C251编译器没了
              操作系统
                      -轮询调度
                       抢夺调度
                       互斥
                       锁
       task 任务
       prority 优先级
   函数参数
         通过寄存器(通常)/固定存储器传递参数
          可以用REGPRAMS /NOREGPRAMS  使能/禁止 寄存器传参
                c汇编混合编程文档能找到
          寄存器最多穿9个参数  R0~R7  R11
   返回值
          也是拿寄存器返回
        


            
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:以坛为家I
  • 打卡总天数:217
  • 最近打卡:2024-11-15 09:12:27

29

主题

722

回帖

2790

积分

荣誉版主

积分
2790
发表于 2023-9-29 15:06:08 | 显示全部楼层
2023/09/ 12第三十九集
       这节课还是看反汇编代码
       定义一个 求和函数 返回 char a ,short int b ,long int c 的和

       重点在函数调用这里
         截图202309291457594853.jpg
       LCALL 调用子程序

        子程序在这      
          截图202309291459215432.jpg
        这里吧参数从寄存器又搬了一次
        放在函数运行中对原来的寄存器进行误操作

        后面的符号拓展  求和  等 就比较熟悉了


        下一个例子 寄存器不够了
         放到存储器了
         看图
          截图202309291504318386.jpg
         放到存储器后,吧DR4释放出来

回复 支持 反对

使用道具 举报 送花

  • 打卡等级:以坛为家I
  • 打卡总天数:217
  • 最近打卡:2024-11-15 09:12:27

29

主题

722

回帖

2790

积分

荣誉版主

积分
2790
发表于 2023-10-1 15:29:34 | 显示全部楼层
2023/09/ 12第四十集

   
        数组名 是地址

        冒泡排序算法--应该是叫这个吧

       截图202310011505155480.jpg

      调用子程序这里 吧数组地址放在寄存器里

       截图202310011507111556.jpg

     这里通过反汇编可以看到数组都是间接寻址

       截图202310011508296800.jpg       

      在memory窗口可以看到数组
      就是说数组一直在存储器,寄存器放不下
      
      下个例子字符串拼接
      
      字符串结尾是  ‘\0’
             没到‘\0’就一直挪指针
             到了就把字符拼接上
             最后补上'\0'
      
     看一下while 循环
      截图202310011519497527.jpg

    用的SJMP  JNZ

   直到 R11 寄存器为0
   说明字符串结束
     

   下一部分是reentrant 可重入

    例子用的是递归

     首次调用 入栈
       截图202310011525151127.jpg
     
     依次调用
       截图202310011528119536.jpg

回复 支持 反对

使用道具 举报 送花

  • 打卡等级:以坛为家I
  • 打卡总天数:217
  • 最近打卡:2024-11-15 09:12:27

29

主题

722

回帖

2790

积分

荣誉版主

积分
2790
发表于 2023-10-1 15:50:33 | 显示全部楼层
2023/09/ 12第四十一集
      _attribute_
               -alias   别名 变量/函数
         
       截图202310011531283665.jpg

     感觉  有点像#define

    截图202310011533011416.jpg

      看到了这两个是完全相同的地址空间

      函数也可以用

       截图202310011534591684.jpg

    laigned(n)  对齐
    截图202310011536455608.jpg

  noreturn  函数远不要返回

   头文件
         #include
                  告诉c预处理包含编译器输入流中指定的文件内容
          多次包含可能有错
                 所以用#ifndef xxx
                           #define xxx
                           
                           #endif
                 
    宏
         减少书写量,不会减少flash   

         还有带参数的宏
                截图202310011543386531.jpg
          可变参数宏
                截图202310011546062698.jpg
           代操作符的宏
                  截图202310011548168906.jpg
           ##操作符
                  截图202310011548529581.jpg
         这一堆是预定义的宏
                截图202310011550188840.jpg

     
回复 支持 反对

使用道具 举报 送花

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|手机版|小黑屋|深圳国芯人工智能有限公司 ( 粤ICP备2022108929号-2 )

GMT+8, 2025-5-4 04:03 , Processed in 0.124197 second(s), 97 queries .

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

快速回复 返回顶部 返回列表