#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 = ;
//0x0028ff10开始的8各字节内存的内容清零
memset((int *)(0x0028ff10), , ); 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\n", (int)(*(int *)(0x0028ff10)));
printf("data in ram 0x0028ff30 = %d\n", (int)(*(int *)(0x0028ff30)));
printf("data in ram 0x0028ff14 = %d\n", (int)(*(int *)(0x0028ff14)));
printf("data in ram 0x0028ff34 = %d\n", (int)(*(int *)(0x0028ff34)));
printf("data in ram 0x0028ff50 = %d\n", (int)(*(int *)(0x0028ff50)));
printf("data in ram 0x0028ff54 = %d\n", (int)(*(int *)(0x0028ff54))); return ;
}

运行结果:

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;
# "typedef_st.c"
typedef struct
{
int io_da;
int io_db;
}GPIO_TypeDef; int main(int argc, char* argv[])
{
int i = ; memset((int *)(0x0028ff10), , ); ((((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\n", (int)(*(int *)(0x0028ff10)));
printf("data in ram 0x0028ff30 = %d\n", (int)(*(int *)(0x0028ff30)));
printf("data in ram 0x0028ff14 = %d\n", (int)(*(int *)(0x0028ff14)));
printf("data in ram 0x0028ff34 = %d\n", (int)(*(int *)(0x0028ff34))); return ;
}

GPIO程序在PC上的模拟学习的更多相关文章

  1. 在PC上测试移动端网站和模拟手机浏览器的5大方法

    在PC上测试移动端网站和模拟手机浏览器的5大方法 来源:互联网 作者:佚名 时间:03-19 10:14:54 [大 中 小]                最近公司要开发网站的移动版,让我准备准备知 ...

  2. 在PC上像普通winform程序调试WINCE程序

    在PC上像普通winform程序调试WINCE程序 步骤: 1. 在VS2008中到 工具→选项→设备工具→设备,选择对应的平台,另存为新的名称,如CEDesktopRun,关闭VS2008.(如果不 ...

  3. 在PC上运行安卓(Android)应用程序的4个方法

    我有一部荣耀3C,一般放在宿舍(我随身携带的是一部诺基亚E63,小巧.稳定.待机时间长),在宿舍我就会用它在微信上看公众号里的文章,最近要考驾照也在上面用驾考宝典.最近想在实验室用这两个软件,但又懒得 ...

  4. 在多台PC上进行ROS通讯-学习笔记

    首先,致谢易科(ExBot)和ROSWiki中文社区. 重要参考文献: Running ROS across multiple machines http://wiki.ros.org/ROS/Tut ...

  5. PC上安装多个操作系统

    目 录 第1章 绪论    1 1.1 目标    1 1.2 适宜的读者    1 第2章 制作启动U盘    2 2.1 初级安装    2 2.2 启动分析    3 2.3 高级安装    1 ...

  6. 微信小程序初体验(上)

    版权声明:本文由练小习原创文章,转载请注明出处: 文章原文链接:https://www.qcloud.com/community/article/204 来源:腾云阁 https://www.qclo ...

  7. 在 WindowMobile 上的模拟LED 显示屏插件(转)

    源:在 WindowMobile 上的模拟LED 显示屏插件 我在给一个对话框上的控件查找翻看合适的图标时,无形中看到了一个LED显示屏的图标,这里所说的LED显示屏是指由很多LED灯密集排列组成的点 ...

  8. mac os x在PC上安装

    系统安装之前的准备工作及安装过程简介 前面我们已经提到,苹果电脑虽然已经采用了x86架构的Intel处理器,但其官方并不提供在非苹果电脑上安装Mac OS的支持.所以,要想在普通PC/笔记本电脑上安装 ...

  9. 让你在PC上调试Web App,UC浏览器发布开发者版

    目前,在手机上使用浏览器访问网页,无法便捷地进行网页语言调试.手机屏幕相对较小且操作不便,直接在手机上进行网页数据调试不太现实. 因此,UC使用技术将手机网页调试信息分离,实现一种能在大屏幕.高配置P ...

随机推荐

  1. NET Core 1.1 静态文件、路由、自定义中间件、身份验证简介

    NET Core 1.1 静态文件.路由.自定义中间件.身份验证简介   概述 之前写过一篇关于<ASP.NET Core 1.0 静态文件.路由.自定义中间件.身份验证简介>的文章,主要 ...

  2. redis和mysql同步 终极解决方案

    使用Canal,类似mysql的主从复制,实时更新 具体使用之后更新

  3. B. Game of the Rows

    B. Game of the Rows time limit per test 1 second memory limit per test 256 megabytes input standard ...

  4. SpringBoot热部署的两种方式

    SpringBoot热部署方式一共有两种,分别使用两种不同的依赖 SpringBoot 1.3后才拥有SpringBoot devtools热部署 ①:spring-boot-devtools   ② ...

  5. 零基础逆向工程22_PE结构06_导入表

    导入表结构 typedef struct _IMAGE_IMPORT_DESCRIPTOR { union { DWORD Characteristics; DWORD OriginalFirstTh ...

  6. filter和map的使 使得数组对象变数组

    let UnitList = this.paytypeData.filter( item => item.CheckBox === true ).map(axis => axis.Unit ...

  7. u-boot剖析(一)----Makefile分析

    由于u-boot比较庞大,所以我们分开来分析,对于一个大型的项目我们想快速的了解其代码架构和内容,最方便的方法就是分析Makefile,所以我们今天以三星的s3c2440来分析Makefile.我们今 ...

  8. TCP/IP协议分析含义与功能

    TCP/IP协议模型从更实用的角度出发,形成了高效的四层体系结构,即网络接口层.IP层.传输层和应用层.TCP/IP是一组专业化协议,包括IP.TCP.UDP.ARP.ICMP以及其它的一些被称为子协 ...

  9. js构造方法

    <!DOCTYPE html><html><head><meta charset="UTF-8"><title>Java ...

  10. POJ 3252 Round Numbers (区间DP,基础)

    题意: 统计区间[L,R]有多少个数,其二进制表示法中的0的个数不少于1的个数?(不允许前缀0) 思路: 状态表示为 [当前第几位][总位数][1的个数],最后判断一下1的个数是否满足条件,要注意前导 ...