#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. 关于AQS——独占锁的相关方法(一)

    一.序言 Lock接口是juc包下一个非常好用的锁,其方便和强大的功能让他成为synchronized的一个很好的替代品. 我们常用的一个Lock的实现类(好像也是唯一一个只实现了Lock接口的类) ...

  2. jQuery banner切换插件

    今天学写了一个基于jQuery焦点图切换插件,有不对的地方还请多多指教,不多说下面是代码: 1.引jQuery库 <script src="http://code.jquery.com ...

  3. 小G搭积木

    A小 G 搭积木文件名 输入文件 输出文件 时间限制 空间限制box.cpp box.in box.out 2s 128MB题目描述小 G 喜欢搭积木.小 G 一共有 n 块积木,并且积木只能竖着一块 ...

  4. 求逆欧拉函数(arc)

    已知欧拉函数计算公式 初始公式:φ(n)=n*(1-1/p1)*(1-1/p2).....*(1-1/pm)   又 n=p1^a1*p2^a2*...*ps^as  欧拉函数是积性函数 那么:φ(n ...

  5. Java并发(二):基础概念

    并发编程的第二部分,先来谈谈发布(Publish)与逸出(Escape); 发布是指:对象能够在当前作用域之外的代码中使用,例如:将对象的引用传递到其他类的方法中,对象的引用保存在其他类可以访问的地方 ...

  6. [LoadRunner]录制启动时报“The JVM could not be started……”错误解决方案

    在LR准备点击录制java over http协议时,程序报如下错误: 报错提示是设置的JVM值设置问题,导致不能启动. 解决方案一 点击F4快捷按钮,会弹出以下界面,在选中的位置选择对应的java路 ...

  7. [Python] - 使用chardet检查网页编码格式时发现的问题

    最近在使用chardet检查网页编码格式时发现如下问题: 用urllib打开网页再检查编码格式和用urllib2打开网页检查编码格式结果不一样,所以urllib2打开可能导致问题,需要关注. 查看了相 ...

  8. JavaScript_3_输出

    1. JavaScript通常用于操作HTML元素,可以使用getElementById(id)方法. JavaScript由Web浏览器来执行. 2. document.write()仅仅向文档输出 ...

  9. 利用jieba第三方库对文件进行关键字提取

    已经爬取到的斗破苍穹文本以TXT形式存储 代码 import jieba.analyse path = 'C:/Users/Administrator/Desktop/bishe/doupo.text ...

  10. js创建弹框(提示框,待确认框)

    ;;} html,body{text-size-adjust:none;-webkit-text-size-adjust:none;-webkit-user-select:none;} a{color ...