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;
    }
  • 相关阅读:
    Eureka获取服务列表源码解析
    Eureka客户端续约及服务端过期租约清理源码解析
    Eureka应用注册与集群数据同步源码解析
    Eureka重要对象简介
    EurekaClient自动装配及启动流程解析
    idea2019注册码
    EurekaServer自动装配及启动流程解析
    程序员的算法课(5)-动态规划算法
    程序员的算法课(4)-二分查找
    程序员的算法课(3)-递归(recursion)算法
  • 原文地址:https://www.cnblogs.com/CodeWorkerLiMing/p/9613653.html
Copyright © 2011-2022 走看看