zoukankan      html  css  js  c++  java
  • GPIO程序在PC上的模拟学习

    #include <stdio.h>
    #include <malloc.h>
    #include <memory.h>
    
    typedef struct gpio
    {
        int pr;
        int pl;
    }* GPIO_MemMapPtr;
    
    //注释为了避免内存出错
    //GPIO_MemMapPtr GPIO_Ptr;    //定义一个结构体指针变量,GCC会分配一个内存的。
    
    #define PTA_BASE_PTR ((GPIO_MemMapPtr)0x0028ff10)
    #define PTD_BASE_PTR ((struct gpio*)0x0028ff50)
        
    #define GPIO_PR_REG(base) ((base)->pr)
    #define GPIO_PL_REG(base) ((base)->pl)
    
    typedef struct
    {
        int io_da;
        int io_db;
    }GPIO_TypeDef;
    #define GPIOB ((GPIO_TypeDef*)(0x0028ff30))
    
    int main(int argc, char* argv[])
    {
        int i = 0;
        //0x0028ff10开始的8各字节内存的内容清零
        memset((int *)(0x0028ff10), 0, 8);
        
        GPIO_PR_REG(PTA_BASE_PTR) = 0x02;
        GPIO_PL_REG(PTA_BASE_PTR) = 0x02;
        
        GPIO_PR_REG(PTD_BASE_PTR) = 0x05;
        GPIO_PL_REG(PTD_BASE_PTR) = 0x06;
        
        //注释为了避免内存出错
        //GPIO_Ptr->pl = 0x03;
        //GPIO_Ptr->pr = 0x04;
        
        //下面的语句是错误的,因为GPIO_MemMapPtr GPIO_Ptr;已经被GCC分配了一个内存,
        //因此该宏定义#define PTC_BASE_PTR ((GPIO_Ptr)0x0028ff20)是错误的,不成立的。
        //GPIO_PR_REG(PTC_BASE_PTR) = 0x03;
        //GPIO_PL_REG(PTC_BASE_PTR) = 0x04;
        
        GPIOB->io_da = 0x01;
        GPIOB->io_db = 0x01;
        
        printf("data in ram 0x0028ff10 = %d
    ", (int)(*(int *)(0x0028ff10)));
        printf("data in ram 0x0028ff30 = %d
    ", (int)(*(int *)(0x0028ff30)));
        printf("data in ram 0x0028ff14 = %d
    ", (int)(*(int *)(0x0028ff14)));
        printf("data in ram 0x0028ff34 = %d
    ", (int)(*(int *)(0x0028ff34)));
        printf("data in ram 0x0028ff50 = %d
    ", (int)(*(int *)(0x0028ff50)));
        printf("data in ram 0x0028ff54 = %d
    ", (int)(*(int *)(0x0028ff54)));
    
        return 0;
    }

    运行结果:

    data in ram 0x0028ff10 = 2
    data in ram 0x0028ff30 = 1
    data in ram 0x0028ff14 = 2
    data in ram 0x0028ff34 = 1
    data in ram 0x0028ff50 = 5
    data in ram 0x0028ff54 = 6

    gdb的内存查看为:

    预编译后gcc -E typedef_st.c -o typedef_st.i:

    typedef struct gpio
    {
     int pr;
     int pl;
    }* GPIO_MemMapPtr;
    
    GPIO_MemMapPtr GPIO_Ptr;
    # 20 "typedef_st.c"
    typedef struct
    {
     int io_da;
     int io_db;
    }GPIO_TypeDef;
    
    
    int main(int argc, char* argv[])
    {
     int i = 0;
    
     memset((int *)(0x0028ff10), 0, 8);
    
     ((((GPIO_MemMapPtr)0x0028ff10))->pr) = 0x02;
     ((((GPIO_MemMapPtr)0x0028ff10))->pl) = 0x02;
    
     ((((struct gpio*)0x0028ff20))->pr) = 0x05;
     ((((struct gpio*)0x0028ff20))->pl) = 0x06;
    
     GPIO_Ptr->pl = 0x03;
     GPIO_Ptr->pr = 0x04;
    
    
    
    
    
    
     ((GPIO_TypeDef*)(0x0028ff30))->io_da = 0x01;
     ((GPIO_TypeDef*)(0x0028ff30))->io_db = 0x01;
    
     printf("data in ram 0x0028ff10 = %d
    ", (int)(*(int *)(0x0028ff10)));
     printf("data in ram 0x0028ff30 = %d
    ", (int)(*(int *)(0x0028ff30)));
     printf("data in ram 0x0028ff14 = %d
    ", (int)(*(int *)(0x0028ff14)));
     printf("data in ram 0x0028ff34 = %d
    ", (int)(*(int *)(0x0028ff34)));
    
        return 0;
    }
  • 相关阅读:
    mysql delete 不支持表别名
    查找应用编译时所找的动态库:LD_DEBUG
    ng
    linux 开机启动自动执行某用户的脚步、程序
    理解Linux系统中的load average(图文版)
    char指针与数组(转载)
    堆 栈 静态区
    linux下which、whereis、locate、find 命令的区别
    linux c动态库编译好了,不能用。有些方法报(undefined reference)错误。
    浅谈管理系统操作日志设计(附操作日志类)
  • 原文地址:https://www.cnblogs.com/CodeWorkerLiMing/p/9613653.html
Copyright © 2011-2022 走看看