【雅特力AT-START-F437评测】-03-移植COREMARK跑分: 483分
[复制链接]
要不是周五版主提醒,差点就忘记了还有个测评,今天就抽一天时间来写两篇测评。
在测评计划中提到了移植COREMARK,个人也还是很好奇AT32F437的性能究竟怎么样,所有今天就来做一个COREMARK的移植,
首先说一下自己的参考帖子,希望对大家有个帮助,后面移植的时候需要注意的地方就可以很明了。
Coremark移植参考:帖子连接
CoreMark 官网链接:官网链接
上面两个帖子分别是移植的参考,还有COREMARK的官网的网址,可以下载源码以及移植时候做参考都是可以的。
下面首先做一下步骤总结:
1:下载COREMARK源码
2:移植源码,修改串口配置,串口重定向,修改定时器。
3:修改堆栈大小,之所以提到这一步是由于堆栈大小如果不做修改是会进入Hardfult的,所以这个就直接单独提出来。
4: 跑分测试;
这里就安好上述步骤来说明吧。
我们子啊原有的基础上,添加串口和定时器。
串口需要设置重定向,我们这里就使用板子上的串口,按照原理图,应该是串口1
void UART1_Init(void)
{
gpio_init_type gpio_init_struct;
/* enable the usart2 and gpio clock */
crm_periph_clock_enable(CRM_USART1_PERIPH_CLOCK, TRUE);
crm_periph_clock_enable(CRM_GPIOA_PERIPH_CLOCK, TRUE);
gpio_default_para_init(&gpio_init_struct);
/* configure the usart2 tx, rx pin */
gpio_init_struct.gpio_drive_strength = GPIO_DRIVE_STRENGTH_STRONGER;
gpio_init_struct.gpio_out_type = GPIO_OUTPUT_PUSH_PULL;
gpio_init_struct.gpio_mode = GPIO_MODE_MUX;
gpio_init_struct.gpio_pins = GPIO_PINS_9 | GPIO_PINS_10;
gpio_init_struct.gpio_pull = GPIO_PULL_NONE;
gpio_init(GPIOA, &gpio_init_struct);
gpio_pin_mux_config(GPIOA, GPIO_PINS_SOURCE9, GPIO_MUX_7);
gpio_pin_mux_config(GPIOA, GPIO_PINS_SOURCE10, GPIO_MUX_7);
/* config usart nvic interrupt */
nvic_priority_group_config(NVIC_PRIORITY_GROUP_4);
nvic_irq_enable(USART1_IRQn, 0, 0);
/* configure usart2 param */
usart_init(USART1, 115200, USART_DATA_8BITS, USART_STOP_1_BIT);
usart_transmitter_enable(USART1, TRUE);
usart_receiver_enable(USART1, TRUE);
/* enable usart2 and usart3 interrupt */
usart_interrupt_enable(USART1, USART_RDBF_INT, TRUE);
usart_enable(USART1, TRUE);
}
void USART1_IRQHandler(void)
{
if(usart_flag_get(USART1, USART_RDBF_FLAG) != RESET)
{
usart_flag_clear(USART1, USART_RDBF_FLAG);
usart_data_transmit(USART1,usart_data_receive(USART1));
}
//--
if(usart_flag_get(USART1, USART_TDBE_FLAG) != RESET)
{
usart_flag_clear(USART1, USART_TDBE_FLAG);
}
}
int fputc(int ch, FILE *f)
{
while(usart_flag_get(USART1, USART_TDBE_FLAG) == RESET);
usart_data_transmit(USART1, ch);
return ch;
}
然后需要设置定时器为1ms,这样的话就基本就算完成一半了,
#include "DRV_Time.h"
void Timer_Init(void)
{
crm_clocks_freq_type crm_clocks_freq_struct = {0};
/* get system clock */
crm_clocks_freq_get(&crm_clocks_freq_struct);
/* enable tmr1 clock */
crm_periph_clock_enable(CRM_TMR1_PERIPH_CLOCK, TRUE);
/* tmr1 configuration */
/* time base configuration */
tmr_base_init(TMR1, 999, 287);//--288分频 =1M 1000计数,相当于1ms ----
tmr_cnt_dir_set(TMR1, TMR_COUNT_UP);
/* overflow interrupt enable */
tmr_interrupt_enable(TMR1, TMR_OVF_INT, TRUE);
/* tmr1 hall interrupt nvic init */
nvic_priority_group_config(NVIC_PRIORITY_GROUP_4);
nvic_irq_enable(TMR1_OVF_TMR10_IRQn, 1, 0);
/* enable tmr1 */
tmr_counter_enable(TMR1, FALSE);
}
unsigned int DATACount=0;
void TMR1_OVF_TMR10_IRQHandler(void)
{
if(tmr_flag_get(TMR1, TMR_OVF_FLAG) == SET)
{
/* add user code... */
DATACount++;
// if(DATACount==500)
// {
// gpio_bits_set(GPIOD,GPIO_PINS_15);
// }
// if(DATACount==1000)
// {
// DATACount=0;
// gpio_bits_reset(GPIOD,GPIO_PINS_15);
// }
tmr_flag_clear(TMR1, TMR_OVF_FLAG);
}
}
然后我们再将COREMARK添加到工程内部。如下图;
完成源码的添加之后,需要在 .s文件中修改堆栈大小,
我们直立直接设置为 4K的堆栈大小。
这里完成之后,我们需要将自己原有的Main 函数注释掉,并且在core_portme.c文件中做定时器的修改以及计数器的启停函数的调用修改。具体的请查看源码。
完成上述工作之后,我们就可以做编译了和查看了。这里的话我就先上图看看。
出现这个打印信息之后需要等待一段时间,让COREMARK进行跑分测试
根据跑分结果来看, 482.975127,这个是在-O3的优化效果跑出来的,如果有兴趣的话可以试试其他的优化等级,这里就不做赘述了,好了,这篇文章就分享到这里。
|