/***********************例一*****************************/
void Function()
{
printf("Call Function!\n");
}
/*Pointer type conversion*/
int main()
{
void (*p)(); /*definition a Pointer p*/
*(int*)&p=(int)Function;
(*p)();
return 0;
}
/***********************例二*****************************/
if (((*(__IO uint32_t*)APPLICATION_ADDRESS) & 0x2FFE0000 ) == 0x20000000)
{
/* Jump to user application */
JumpAddress = *(__IO uint32_t*) (APPLICATION_ADDRESS + 4);
JumpToApplication = (pFunction) JumpAddress;
/* Initialize user application's Stack Pointer */
__set_MSP(*(__IO uint32_t*) APPLICATION_ADDRESS);
JumpToApplication();
}
第一句 void (*p)(); 定义了一个函数指针p;
第二句*(int*)&p = (int)Function;中的&p可以理解为常量指针,指向指着变量p;而(int*)&p是对指针&p指向的变量内容解释为int类型;
if (((*(__IO uint32_t*)APPLICATION_ADDRESS) & 0x2FFE0000 ) == 0x20000000)
APPLICATION_ADDRESS是STM32类单片机向量表重定向后的地址。此句判断程序设置起始地址所存储的内容是否为内存范围之内,内存范围是起始地址为0x20000000,根据不同芯片RAM容量不同,0x2FFE0000的值不同。具体算法为: