#include <stm32f10x_conf.h>
#include "sys.h"
#include "delay.h"
#include "usart.h"
#include "string.h"
__align(8) uint8_t value[1024] __attribute__((at(0x20000100)));
void UartSendByte(USART_TypeDef* uart,u8 data);
void test(void (*p)(USART_TypeDef*,u8))
{
p(USART1, ((unsigned int)test >> 24) & 0xFF);
p(USART1, ((unsigned int)test >> 16) & 0xFF);
p(USART1, ((unsigned int)test >> 8) & 0xFF);
p(USART1, ((unsigned int)test >> 0) & 0xFF);
}
void Initialization()
{
MCU_INIT(RCC_PLLMul_9);
Uart_Init(USART1,115200,72);
}
int main(void)
{
Initialization();
printf("%.8X\r\n", (unsigned int)main);
unsigned int addr = (unsigned int)test & 0xFFFFFFFE; //最低位置1表示Thumb模式,清空该位为函数实际地址
printf("%.8X\r\n", addr);
memcpy(value, (uint8_t *)addr, sizeof(value));
void (*p)(void*) = (void (*)(void*))((unsigned int)(value) | 0x01); //最低位置1进入Thumb模式
printf("%.8X\r\n", p);
p(UartSendByte);
while(1);
}
由于代码中很多函数的跳转都是相对跳转,所以,如果在test函数中直接调用UartSendByte函数,那么直接调用test函数是没有问题的,但是将test函数拷贝到内存中去再执行,相对跳转的地址就不对了。所以测试函数里面使用函数指针将UartSendByte函数的地址做为参数传入到test中。
|