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 = ;
//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上的模拟学习的更多相关文章
- 在PC上测试移动端网站和模拟手机浏览器的5大方法
在PC上测试移动端网站和模拟手机浏览器的5大方法 来源:互联网 作者:佚名 时间:03-19 10:14:54 [大 中 小] 最近公司要开发网站的移动版,让我准备准备知 ...
- 在PC上像普通winform程序调试WINCE程序
在PC上像普通winform程序调试WINCE程序 步骤: 1. 在VS2008中到 工具→选项→设备工具→设备,选择对应的平台,另存为新的名称,如CEDesktopRun,关闭VS2008.(如果不 ...
- 在PC上运行安卓(Android)应用程序的4个方法
我有一部荣耀3C,一般放在宿舍(我随身携带的是一部诺基亚E63,小巧.稳定.待机时间长),在宿舍我就会用它在微信上看公众号里的文章,最近要考驾照也在上面用驾考宝典.最近想在实验室用这两个软件,但又懒得 ...
- 在多台PC上进行ROS通讯-学习笔记
首先,致谢易科(ExBot)和ROSWiki中文社区. 重要参考文献: Running ROS across multiple machines http://wiki.ros.org/ROS/Tut ...
- PC上安装多个操作系统
目 录 第1章 绪论 1 1.1 目标 1 1.2 适宜的读者 1 第2章 制作启动U盘 2 2.1 初级安装 2 2.2 启动分析 3 2.3 高级安装 1 ...
- 微信小程序初体验(上)
版权声明:本文由练小习原创文章,转载请注明出处: 文章原文链接:https://www.qcloud.com/community/article/204 来源:腾云阁 https://www.qclo ...
- 在 WindowMobile 上的模拟LED 显示屏插件(转)
源:在 WindowMobile 上的模拟LED 显示屏插件 我在给一个对话框上的控件查找翻看合适的图标时,无形中看到了一个LED显示屏的图标,这里所说的LED显示屏是指由很多LED灯密集排列组成的点 ...
- mac os x在PC上安装
系统安装之前的准备工作及安装过程简介 前面我们已经提到,苹果电脑虽然已经采用了x86架构的Intel处理器,但其官方并不提供在非苹果电脑上安装Mac OS的支持.所以,要想在普通PC/笔记本电脑上安装 ...
- 让你在PC上调试Web App,UC浏览器发布开发者版
目前,在手机上使用浏览器访问网页,无法便捷地进行网页语言调试.手机屏幕相对较小且操作不便,直接在手机上进行网页数据调试不太现实. 因此,UC使用技术将手机网页调试信息分离,实现一种能在大屏幕.高配置P ...
随机推荐
- Core中使用Razor视图引擎渲染视图为字符串 阅读目录
Core中使用Razor视图引擎渲染视图为字符串 } <!DOCTYPE html> <html> <head> <title>Render view ...
- 从I/O事件到阻塞、非阻塞、poll到epoll的理解过程
I/O事件 I/O事件 非阻塞I/O.在了解非阻塞I/O之前,需要先了解I/O事件 我们知道,内核有缓冲区.假设有两个进程A,B,进程B想读进程A写入的东西(即进程A做写操作,B做读操作).进程A ...
- 不同ORM新的理解
对于ORM你怎么理解?你用过的ORM有什么区别?这是面试的时候基本上会问的问题. 问题很简单,本文不在阐述.本文主要讨论Dapper 和 EF Core First的区别. 从直观上来看两个都是ORM ...
- dynomite:高可用多数据中心同步
https://github.com/Netflix/dynomite Dynomite, inspired by Dynamo whitepaper, is a thin, distributed ...
- Java thymeleaf模板获取资源文件的内容
我们在某些时候可能需要获取配置文件properties中的配置信息,而不需要用Java传给模板,在模板中就可以直接获取 我们需要在resources/下定义国际化配置文件即可,注意名称必须中messa ...
- uvm_reg_map——寄存器模型(八)
所有的寄存器都需要地址,都需要加入到地址列表中 //-------------------------------------------------------------------------- ...
- ERwin DM Reverse Engineer 逆向工程介绍
介绍内容:利用ERwin DM进行对本地 Oracle 数据库的逆向工程 ERwin DM Version:7.3 ERwin DM 提供两种方式的逆向工程方法,分别是基于脚本文件和基于数据库. 下面 ...
- cmd_ping命令
ping命令是网络命令里的核心命令,同时也是黑客入侵的基础命令.下面和大家分享一下ping命令的基础知识和一般用法. 以ping百度公司域名为例,介绍ping命令相关内容. 一.ping命令基础知识 ...
- python 之 re 模块
re模块下的常用方法 1.findall:返回所有满足匹配条件的结果,放在列表里. import re # 查找数字 result = re.findall('\d+','nizhidao 123 w ...
- 一个SQL server的事务存储
-- ============================================= -- Author: Evan -- Create date: 2018年6月14日 16点27分 - ...