1823|1

207

帖子

0

TA的资源

一粒金砂(高级)

楼主
 

【雅特力AT-START-F437评测】-03-移植COREMARK跑分: 483分 [复制链接]

 

要不是周五版主提醒,差点就忘记了还有个测评,今天就抽一天时间来写两篇测评。

在测评计划中提到了移植COREMARK,个人也还是很好奇AT32F437的性能究竟怎么样,所有今天就来做一个COREMARK的移植,

首先说一下自己的参考帖子,希望对大家有个帮助,后面移植的时候需要注意的地方就可以很明了。

Coremark移植参考:帖子连接

CoreMark 官网链接:官网链接

上面两个帖子分别是移植的参考,还有COREMARK的官网的网址,可以下载源码以及移植时候做参考都是可以的。

下面首先做一下步骤总结:

1:下载COREMARK源码

2:移植源码,修改串口配置,串口重定向,修改定时器。

3:修改堆栈大小,之所以提到这一步是由于堆栈大小如果不做修改是会进入Hardfult的,所以这个就直接单独提出来。

4: 跑分测试;

这里就安好上述步骤来说明吧。

我们子啊原有的基础上,添加串口和定时器。

串口需要设置重定向,我们这里就使用板子上的串口,按照原理图,应该是串口1

婵犵數濮烽弫鍛婃叏閻戣棄鏋侀柛娑橈攻閸欏繘鏌i幋锝嗩棄闁哄绶氶弻娑樷槈濮楀牊鏁鹃梺鍛婄懃缁绘﹢寮婚敐澶婄闁挎繂妫Λ鍕⒑閸濆嫷鍎庣紒鑸靛哺瀵鈽夊Ο閿嬵潔濠殿喗顨呴悧濠囧极妤e啯鈷戦柛娑橈功閹冲啰绱掔紒姗堣€跨€殿喖顭烽弫鎰緞婵犲嫷鍚呴梻浣瑰缁诲倸螞椤撶倣娑㈠礋椤栨稈鎷洪梺鍛婄箓鐎氱兘宕曟惔锝囩<闁兼悂娼ч崫铏光偓娈垮枦椤曆囧煡婢跺á鐔兼煥鐎e灚缍屽┑鐘愁問閸犳銆冮崨瀛樺亱濠电姴娲ら弸浣肝旈敐鍛殲闁抽攱鍨块弻娑樷槈濮楀牆濮涢梺鐟板暱閸熸壆妲愰幒鏃傜<婵☆垰鎼~鎺戔攽閻橆偄浜炬繛鎾村焹閸嬫挻鎱ㄦ繝鍛仩缂侇喗鐟ч幑鍕Ω瑜滈崬鍫曟⒒娴e憡鍟為柤褰掔畺椤㈡牠宕堕埡鍌ゆ綗闂佺粯鍔曢幖顐ょ不閿濆鐓ラ柡鍐ㄥ€瑰▍鏇㈡煕濮椻偓娴滆泛顫忓ú顏咁棃婵炴番鍔岀紞濠傜暦閺囥垺鐒肩€广儱鎳愰崝锕€顪冮妶鍡楀潑闁稿鎸荤换娑氫焊閺嶃倕浜鹃柟棰佺濞堛劍绻濋悽闈浶g痪鏉跨Ч瀵煡骞撻幒婵堝數闁荤姾娅g亸銊╁礉閻旀悶浜滈柡鍐e亾閻㈩垽绻濋獮鍐ㄎ旈崘鈺佹瀭闂佸憡娲﹂崜娑⑺囬妷銉㈡斀闁绘劘灏欏﹢鎾煕婵犲啰绠撻柣锝囧厴椤㈡洟鍩涘顓熴仢妞ゃ垺妫冨畷銊╊敂閸涱収浼栭梻鍌氬€风粈渚€骞夐敍鍕床闁稿本澹曢崑鎾愁潩閸楃偛骞嬮悗瑙勬礃濞茬喖鐛崶顒佸亱闁割偁鍨归獮妤佺節瀵伴攱婢橀埀顒佹尵濞嗐垽鍨鹃弬銉︾亖濠殿喗銇涢崑鎾绘煛瀹€鈧崰鏍偘椤曗偓瀹曞綊顢欓崣銉﹀亝闂傚倷绀侀悿鍥涢崟顖€鍥垂椤愶絽寮块梺閫炲苯澧撮柡宀嬬到铻f繛鑼额嚙閺呴亶姊洪崨濠呭闁硅櫕锚椤繒绱掑Ο璇差€撻梺鎯х箳閹虫挾绮敓鐘斥拺闁告稑锕ラ埛鎰箾閼碱剙鏋涢柕鍡曠椤繃锛愬┑鍥ㄦ珝闂備胶绮崝蹇涘疾濠婂牊鍊跺〒姘e亾婵﹥妞藉Λ鍐ㄢ槈濮橆剦鏆俊鐐€х紓姘跺础閹惰棄鏄ユ繛鎴欏灩缁狅綁鏌i幇顔芥毄妞ゆ梹娲熷娲偂鎼存稑浠銈冨€曢崐鍨暦闂堟稈鏋庨柟鏉跨仛椤旀棃姊虹紒妯哄闁诡垰鑻埢鎾斥堪閸喓鍘搁悗鍏夊亾闁逞屽墴瀹曚即寮介鐐电暫闂佺粯鍨兼慨銈夊磻鐎n喗鐓曟い鎰剁悼缁犳牠鏌h箛鎾诲弰闁哄矉绲鹃幆鏃堝閳轰焦娅涢梻浣告憸婵敻鎮ч悩璇茬伋闁挎洖鍊归崐濠氭煢濡警妲洪柣锝嗘そ濮婃椽妫冨☉姘辩杽闂佺ǹ锕ラ悧鐘荤嵁閸℃稒鍊烽柣鎴炨缚閸橀亶姊洪幐搴㈩梿妞ゆ泦鍐惧殨閻犳亽鍔庣壕濂稿级閸稑濡块柛娆屽亾婵犳鍠栭敃锔惧垝椤栨粎绠旈柣鏃傚帶閻掑灚銇勯幒鍡椾壕鐎光偓閿濆牆鍔垫い锔芥尦閺岀喖鐛崹顔句紙濡ょ姷鍋炵敮锟犵嵁濮椻偓瀵爼骞嬪┑鍛闂傚倸鍊烽悞锕傛儑瑜版帒鍨傜憸鐗堝笒缁犵喖鏌ㄩ悢鍝勑㈢痪鎯х秺閺屾盯顢曢敐鍡欘槰闂佺粯鎸诲ú姗€濡甸崟顖氱疀妞ゆ柨銇欓姀銈嗙厱闁哄啠鍋撶紒顔芥崌瀵顓兼径瀣弳闁诲函缍嗘禍鐐村瀹€鍕拺闁告繂瀚﹢鎵磼鐎n偄鐏撮柛鈺冨仱楠炲鏁冮埀顒勭嵁閵忊€茬箚闁靛牆鎷戝妤呮煙椤曞棛绋诲ǎ鍥э躬閹瑩顢旈崟銊ヤ壕闁哄洨濮靛畷鏌ユ煕椤愮姴鍔氱痪鎯ф健閺岋綁濮€閳惰泛缍婇幏鎴︽偄閸濄儳顔曢梺鐟邦嚟閸嬬喖骞婇崟顖涚厱閹艰揪绲介弸娑㈡煛鐏炶濡奸柍瑙勫灴瀹曞崬顫滈崱姗堢磼濠电姵顔栭崳顖滃緤娴犲鍋嬮柟鎹愵嚙缁犳牗淇婇妶鍌氫壕闂佸磭绮幑鍥х暦瑜版帩鏁婇柣锝呭闁垰鈹戦敍鍕杭闁稿ǹ鍊濆畷锝夊礃椤旇偐鍝楅柡澶婄墑閸斿酣鍩炲鍛斀闁绘ê寮堕幖鎰磼閻樺灚鍤€闂囧鏌ㄥ┑鍡樺櫤闁瑰弶鎮傞弻娑樜熺紒妯衡偓鎰叏婵犲懏顏犵紒顔界懇楠炴劖鎯旈姀鈥愁伆闂傚倷鐒﹀鍧楀矗鎼淬劌绐楁慨妯垮煐閸ゅ秹寮堕崼娑樺妞も晝鍏橀幃妤呮晲鎼粹€茬爱闂佸綊顥撶划顖滄崲濞戞瑦缍囬柛鎾楀啫鐓傞梻浣侯攰濞呮洟鎮烽妸鈺佄﹂柟鐗堟緲缁犳娊鏌熺€涙ḿ绠樼憸鏉款槹娣囧﹪鎮欓鍕ㄥ亾閺嶎偅鏆滈柟鐑橆殔绾剧懓鈹戦悩宕囶暡闁稿孩顨嗙换娑㈠幢濡闉嶉梺缁樻尰閻熲晛顕i崼鏇為唶闁绘柨鍢叉慨銏ゆ⒑娴兼瑩妾紒顔芥崌瀵鍩勯崘鈺侇€撶紓浣割儏缁ㄩ亶宕戦幘璇查敜婵°倐鍋撻柦鍐枛閺屾洘绻涢悙顒佺彆闂佺ǹ顑呭Λ婵嬪蓟濞戞矮娌柛鎾椻偓濡插牆顪冮妶鍛寸崪闁瑰嚖鎷�
  • 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,这样的话就基本就算完成一半了,

婵犵數濮烽弫鍛婃叏閻戣棄鏋侀柛娑橈攻閸欏繘鏌i幋锝嗩棄闁哄绶氶弻娑樷槈濮楀牊鏁鹃梺鍛婄懃缁绘﹢寮婚敐澶婄闁挎繂妫Λ鍕⒑閸濆嫷鍎庣紒鑸靛哺瀵鈽夊Ο閿嬵潔濠殿喗顨呴悧濠囧极妤e啯鈷戦柛娑橈功閹冲啰绱掔紒姗堣€跨€殿喖顭烽弫鎰緞婵犲嫷鍚呴梻浣瑰缁诲倸螞椤撶倣娑㈠礋椤栨稈鎷洪梺鍛婄箓鐎氱兘宕曟惔锝囩<闁兼悂娼ч崫铏光偓娈垮枦椤曆囧煡婢跺á鐔兼煥鐎e灚缍屽┑鐘愁問閸犳銆冮崨瀛樺亱濠电姴娲ら弸浣肝旈敐鍛殲闁抽攱鍨块弻娑樷槈濮楀牆濮涢梺鐟板暱閸熸壆妲愰幒鏃傜<婵☆垰鎼~鎺戔攽閻橆偄浜炬繛鎾村焹閸嬫挻鎱ㄦ繝鍛仩缂侇喗鐟ч幑鍕Ω瑜滈崬鍫曟⒒娴e憡鍟為柤褰掔畺椤㈡牠宕堕埡鍌ゆ綗闂佺粯鍔曢幖顐ょ不閿濆鐓ラ柡鍐ㄥ€瑰▍鏇㈡煕濮椻偓娴滆泛顫忓ú顏咁棃婵炴番鍔岀紞濠傜暦閺囥垺鐒肩€广儱鎳愰崝锕€顪冮妶鍡楀潑闁稿鎸荤换娑氫焊閺嶃倕浜鹃柟棰佺濞堛劍绻濋悽闈浶g痪鏉跨Ч瀵煡骞撻幒婵堝數闁荤姾娅g亸銊╁礉閻旀悶浜滈柡鍐e亾閻㈩垽绻濋獮鍐ㄎ旈崘鈺佹瀭闂佸憡娲﹂崜娑⑺囬妷銉㈡斀闁绘劘灏欏﹢鎾煕婵犲啰绠撻柣锝囧厴椤㈡洟鍩涘顓熴仢妞ゃ垺妫冨畷銊╊敂閸涱収浼栭梻鍌氬€风粈渚€骞夐敍鍕床闁稿本澹曢崑鎾愁潩閸楃偛骞嬮悗瑙勬礃濞茬喖鐛崶顒佸亱闁割偁鍨归獮妤佺節瀵伴攱婢橀埀顒佹尵濞嗐垽鍨鹃弬銉︾亖濠殿喗銇涢崑鎾绘煛瀹€鈧崰鏍偘椤曗偓瀹曞綊顢欓崣銉﹀亝闂傚倷绀侀悿鍥涢崟顖€鍥垂椤愶絽寮块梺閫炲苯澧撮柡宀嬬到铻f繛鑼额嚙閺呴亶姊洪崨濠呭闁硅櫕锚椤繒绱掑Ο璇差€撻梺鎯х箳閹虫挾绮敓鐘斥拺闁告稑锕ラ埛鎰箾閼碱剙鏋涢柕鍡曠椤繃锛愬┑鍥ㄦ珝闂備胶绮崝蹇涘疾濠婂牊鍊跺〒姘e亾婵﹥妞藉Λ鍐ㄢ槈濮橆剦鏆俊鐐€х紓姘跺础閹惰棄鏄ユ繛鎴欏灩缁狅綁鏌i幇顔芥毄妞ゆ梹娲熷娲偂鎼存稑浠銈冨€曢崐鍨暦闂堟稈鏋庨柟鏉跨仛椤旀棃姊虹紒妯哄闁诡垰鑻埢鎾斥堪閸喓鍘搁悗鍏夊亾闁逞屽墴瀹曚即寮介鐐电暫闂佺粯鍨兼慨銈夊磻鐎n喗鐓曟い鎰剁悼缁犳牠鏌h箛鎾诲弰闁哄矉绲鹃幆鏃堝閳轰焦娅涢梻浣告憸婵敻鎮ч悩璇茬伋闁挎洖鍊归崐濠氭煢濡警妲洪柣锝嗘そ濮婃椽妫冨☉姘辩杽闂佺ǹ锕ラ悧鐘荤嵁閸℃稒鍊烽柣鎴炨缚閸橀亶姊洪幐搴㈩梿妞ゆ泦鍐惧殨閻犳亽鍔庣壕濂稿级閸稑濡块柛娆屽亾婵犳鍠栭敃锔惧垝椤栨粎绠旈柣鏃傚帶閻掑灚銇勯幒鍡椾壕鐎光偓閿濆牆鍔垫い锔芥尦閺岀喖鐛崹顔句紙濡ょ姷鍋炵敮锟犵嵁濮椻偓瀵爼骞嬪┑鍛闂傚倸鍊烽悞锕傛儑瑜版帒鍨傜憸鐗堝笒缁犵喖鏌ㄩ悢鍝勑㈢痪鎯х秺閺屾盯顢曢敐鍡欘槰闂佺粯鎸诲ú姗€濡甸崟顖氱疀妞ゆ柨銇欓姀銈嗙厱闁哄啠鍋撶紒顔芥崌瀵顓兼径瀣弳闁诲函缍嗘禍鐐村瀹€鍕拺闁告繂瀚﹢鎵磼鐎n偄鐏撮柛鈺冨仱楠炲鏁冮埀顒勭嵁閵忊€茬箚闁靛牆鎷戝妤呮煙椤曞棛绋诲ǎ鍥э躬閹瑩顢旈崟銊ヤ壕闁哄洨濮靛畷鏌ユ煕椤愮姴鍔氱痪鎯ф健閺岋綁濮€閳惰泛缍婇幏鎴︽偄閸濄儳顔曢梺鐟邦嚟閸嬬喖骞婇崟顖涚厱閹艰揪绲介弸娑㈡煛鐏炶濡奸柍瑙勫灴瀹曞崬顫滈崱姗堢磼濠电姵顔栭崳顖滃緤娴犲鍋嬮柟鎹愵嚙缁犳牗淇婇妶鍌氫壕闂佸磭绮幑鍥х暦瑜版帩鏁婇柣锝呭闁垰鈹戦敍鍕杭闁稿ǹ鍊濆畷锝夊礃椤旇偐鍝楅柡澶婄墑閸斿酣鍩炲鍛斀闁绘ê寮堕幖鎰磼閻樺灚鍤€闂囧鏌ㄥ┑鍡樺櫤闁瑰弶鎮傞弻娑樜熺紒妯衡偓鎰叏婵犲懏顏犵紒顔界懇楠炴劖鎯旈姀鈥愁伆闂傚倷鐒﹀鍧楀矗鎼淬劌绐楁慨妯垮煐閸ゅ秹寮堕崼娑樺妞も晝鍏橀幃妤呮晲鎼粹€茬爱闂佸綊顥撶划顖滄崲濞戞瑦缍囬柛鎾楀啫鐓傞梻浣侯攰濞呮洟鎮烽妸鈺佄﹂柟鐗堟緲缁犳娊鏌熺€涙ḿ绠樼憸鏉款槹娣囧﹪鎮欓鍕ㄥ亾閺嶎偅鏆滈柟鐑橆殔绾剧懓鈹戦悩宕囶暡闁稿孩顨嗙换娑㈠幢濡闉嶉梺缁樻尰閻熲晛顕i崼鏇為唶闁绘柨鍢叉慨銏ゆ⒑娴兼瑩妾紒顔芥崌瀵鍩勯崘鈺侇€撶紓浣割儏缁ㄩ亶宕戦幘璇查敜婵°倐鍋撻柦鍐枛閺屾洘绻涢悙顒佺彆闂佺ǹ顑呭Λ婵嬪蓟濞戞矮娌柛鎾椻偓濡插牆顪冮妶鍛寸崪闁瑰嚖鎷�
  • #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的优化效果跑出来的,如果有兴趣的话可以试试其他的优化等级,这里就不做赘述了,好了,这篇文章就分享到这里。

 

点赞 关注
 
 

回复
举报

207

帖子

0

TA的资源

一粒金砂(高级)

沙发
 

过来看看

 
 
 

回复
您需要登录后才可以回帖 登录 | 注册

查找数据手册?

EEWorld Datasheet 技术支持

相关文章 更多>>
关闭
站长推荐上一条 1/10 下一条
艾睿电子& Silicon Labs 有奖直播 | 全新蓝牙信道探测:从技术创新到实际应用
直播时间:3月12日(周三)上午10:00
直播奖励:多功能榨汁机、蓝牙音箱、手机支架

查看 »

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

About Us 关于我们 客户服务 联系方式 器件索引 网站地图 最新更新 手机版

站点相关: 国产芯 安防电子 汽车电子 手机便携 工业控制 家用电子 医疗电子 测试测量 网络通信 物联网

北京市海淀区中关村大街18号B座15层1530室 电话:(010)82350740 邮编:100190

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2025 EEWORLD.com.cn, Inc. All rights reserved
快速回复 返回顶部 返回列表