if(((*(vu32*)(0X20001000+4))&0xFF000000)==0x08000000)分析
来源:互联网 发布:淘宝加入购物车的好处 编辑:程序博客网 时间:2024/04/30 19:17
if(((*(vu32*)(0X20001000+4))&0xFF000000)==0x08000000)分析
(*(vu32*)(0X20001000+4))== (*(__IO uint32_t*)(0X20001000+4))
==(*(volatile unsigned int*)(0X20001000+4))
(*(vu32*)(0X20001000+4))通过内存寻址访问地址为(0x20001000 + 4)中的值
(0X20001000+4)只是一个常量;
(volatile unsigned int*)(0X20001000+4)将0x20001000 + 4这个常量强制转化成volatile unsigned int类型的指针;
(*(volatile unsigned int*)(0X20001000+4))相对于取0x20001000 + 4地址处的值
串口接收来的数据从0x20001000开始存储,第一个4个字节为栈顶地址,第二个4字节为复位中断向量的入口地址。1) STM32正常运行流程图
STM32在复位后,先从0x08000004地址取出复位中断向量的地址,并跳转到复位中断复位程序,如图标号①所示;在复位中断复位程序执行完之后,会跳转到main函数,如图标号②所示;main函数一般是一个死循环,在main函数执行过程中,如果收到中断请求,此时STM32强制将PC指针指回中断向量表处,如图标号③所示;然后,根据中断源进入相应的中断服务程序,如图标号④所示;在执行完中断服务程序后,程序再次返回main函数执行,如图标号⑤所示。
2) volatile
1.volatile是一个类型修饰符(typespecifier);
2.volatile关键字声明的变量,编译器对访问该变量的代码就不再进行优化;
例如:
要往某一地址写数据:
int*a =0;
*a=1;
*a=2;
以上程序编译器可能做优化而成:
int*a =0;
*a=2;
结果第一个指令丢失。如果用volatile声明,编译器就不允许做任何的优化,从而保证程序的原意:
int*a =0;
*a=1;
*a=2;
即使你要编译器做优化,它也不会把两次赋值语句简化为一。它只能做其它的优化。
3.volatile关键字声明的变量,每次都必须从内存中读取数据,而不能使用放在cache或寄存器中的备份;
例如:
volatilechar a;
a= 0;
while(!a)
{
//dosome things
}
doother();
如果变量没有声明为volatile,那么do other()不会被执行;
3) STM32内核(Cortex-M3)的存储器映射
存储器映射是指把芯片中或芯片外的FLASH,RAM,外设,BOOTBLOCK等进行统一编址。即用地址来表示对象。这个地址绝大多数是由厂家规定好的,用户只能用而不能改。用户只能在挂外部RAM或FLASH的情况下可进行自定义。
- if(((*(vu32*)(0X20001000+4))&0xFF000000)==0x08000000)分析
- STM32从Flash地址0x08000000的启动重映射
- STM32从Flash地址0x08000000的启动重映射
- MDK debug时error 57:illegal address (0x08000000)解决办法
- RT-Thread 升级时起始运行地址不是0x08000000
- STM32从Flash地址0x08000000的启动重映射
- 为什么STM32从Flash地址0x08000000的启动重映射
- if(a);if(!a);if(a!=0);if(a==0)有什么区别?
- *.axf: Error: L6967E: Entry point (0x08000000) points to a Thumb instruction but is not a valid T
- #if 0 #end if
- #if 0 #end if
- #if 0
- if 0
- #if 0
- “#if 0/#if 1 ... #endif”
- if 1 endif if 0
- vu32 volatile
- if (p == NULL), if (p == 0) 还是 if(p) ?--再论空指针检测问题
- QQ浏览器优化
- MAMP:在 OSX 中搭建 Apache, MySQL, PHP 环境并本地安装、调试 WordPress
- 这是一份耐心和责任的考验--写在前面的话
- C语言学:__stdcall、__cdcel和__fastcall三者的区别
- 为何使用百度输入法老是出现错别字?
- if(((*(vu32*)(0X20001000+4))&0xFF000000)==0x08000000)分析
- wince 下的各种全屏方法
- MySQL utf8mb4 字符集:支持 emoji 表情符号
- 【ACM之旅】数列特征2
- Unity3d接入googleplay内购详细说明(二)
- shell学习笔记:运算符
- 什么是大数据?
- 重定位SVN地址
- Python上的实用技巧