RISC-V技术论坛
直播中

Evanee

4年用户 11经验值
擅长:嵌入式技术
私信 关注

【先辑半导体HPM6750EVKMINI评估板试用体验】##2:coremark跑分与FreeRTOS

本帖最后由 Evanee 于 2022-6-19 14:26 编辑

1.前言使用先辑的芯片,当然就是看上它的高性能,顺便了解了一下晶心D45内核,发现华人都有一个特点,要是掌握了一个mcu的设计精髓,就会尽量多的开掘出更高的性能,更强的外设,继续卷死在行业作威作福的lw。那么拿到先辑开发板,当然要跑跑分,顺便与一众芯片做做比较。

2.生成coremark工程

1)这次选择生成flash里面执行的工程。
  1. >generate_project -b hpm6750evkmini -t flash_xip

2)使用SEGGER Embedded Studio编译下载,并运行。


好家伙,单核跑出4553分,大家可能只看分数没啥概念,看看常用的芯片跑分对比:
rt1052能跑出3000多分,nxp官方都说是高性能,搞了很多跑分文章,看来已经被秒杀。
STM32F1只能跑出108分。
i.mx6ul跑出1500分。
呼声很高的全志D1可以跑出2240分。
相比之下,先辑这HPM6750可真够优秀的!!

有了这么高的性能,可以写比较复杂的计算或者控制程序了。

3.生成FreeRTOS工程有了高性能还不够,需要加上RTOS,高性能才能被充分利用。仍然借助SDK例子。
start_cmd.cmd进入sdk_env_v0.11.0hpm_sdksamples
tos
  1. > generate_project -b hpm6750evkmini -t flash_xip

4.代码分析
使用使用SEGGER Embedded Studio打开,并对代码进行简单修改。freertos建立task,运行task代码分析不再赘述。
  1. #include "FreeRTOS.h"
  2. #include "task.h"
  3. #include
  4. #include "board.h"
  5. #include "hpm_gpio_drv.h"

  6. #define task1_PRIORITY    (configMAX_PRIORItiES - 5U)
  7. #define task2_PRIORITY    (configMAX_PRIORITIES - 4U)

  8. volatile bool led_on;

  9. static void task1(void *pvParameters)
  10. {
  11.     for (;;) {

  12.         printf("LED is %s.
  13. ", led_on ? "on" : "off");
  14.         vTaskDelay(1000);
  15.     }
  16. }

  17. static void task2(void *pvParameters)
  18. {
  19.     for (;;) {

  20.         gpio_toggle_pin(BOARD_LED_GPIO_CTRL, BOARD_LED_GPIO_INDEX, BOARD_LED_GPIO_PIN);
  21.         printf("task2: Toggle the led pin level
  22. ");
  23.         led_on = !led_on;
  24.         vTaskDelay(1000);
  25.     }
  26. }

  27. int main(void)
  28. {
  29.     board_init();
  30.     board_init_gpio_pins();

  31.     gpio_set_pin_output(BOARD_LED_GPIO_CTRL, BOARD_LED_GPIO_INDEX, BOARD_LED_GPIO_PIN);
  32.     gpio_write_pin(BOARD_LED_GPIO_CTRL, BOARD_LED_GPIO_INDEX, BOARD_LED_GPIO_PIN, BOARD_LED_ON_LEVEL);

  33.     led_on = true;

  34.     if (xTaskCreate(task1, "task1", configMINIMAL_STACK_SIZE + 256U, NULL, task1_PRIORITY, NULL) != pdPASS) {
  35.         printf("Task1 creation failed!.
  36. ");
  37.         for (;;) {
  38.             ;
  39.         }
  40.     }
  41.     if (xTaskCreate(task2, "task2", configMINIMAL_STACK_SIZE + 256U, NULL, task2_PRIORITY, NULL) != pdPASS) {
  42.         printf("Task2 creation failed!.
  43. ");
  44.         for (;;) {
  45.             ;
  46.         }
  47.     }
  48.     vTaskStartScheduler();
  49.     for (;;) {
  50.         ;
  51.     }
  52.     return 0;
  53. }
这里顺便分析一下gpio的初始化方法:
  1. /**************************************************************
  2.         主要分析一下main函数中的gpio初始化函数
  3. ***************************************************************/
  4. board_init_gpio_pins();

  5. /**************************************************************
  6.         函数原型在board.c中定义
  7. ***************************************************************/
  8. void board_init_gpio_pins(void)
  9. {
  10.     init_gpio_pins();
  11. }
  12. //borad.c中定义
  13. void init_gpio_pins(void)
  14. {
  15.     uint32_t pad_ctl = IOC_PAD_PAD_CTL_PE_SET(1) | IOC_PAD_PAD_CTL_PS_SET(1);

  16.     /* Green LED*/
  17.     HPM_IOC->PAD[IOC_PAD_PB18].FUNC_CTL = IOC_PB18_FUNC_CTL_GPIO_B_18;
  18.     HPM_IOC->PAD[IOC_PAD_PB18].PAD_CTL = pad_ctl;

  19. }

  20. /**************************************************************
  21.         寄存器配置宏命令
  22. ***************************************************************/
  23. /*
  24. * PS (RW)
  25. *
  26. * pull select
  27. * 0: pull down
  28. * 1: pull up
  29. */
  30. #define IOC_PAD_PAD_CTL_PS_MASK (0x800U)
  31. #define IOC_PAD_PAD_CTL_PS_SHIFT (11U)
  32. #define IOC_PAD_PAD_CTL_PS_SET(x) (((uint32_t)(x) << IOC_PAD_PAD_CTL_PS_SHIFT) & IOC_PAD_PAD_CTL_PS_MASK)
  33. #define IOC_PAD_PAD_CTL_PS_GET(x) (((uint32_t)(x) & IOC_PAD_PAD_CTL_PS_MASK) >> IOC_PAD_PAD_CTL_PS_SHIFT)

  34. /*
  35. * PE (RW)
  36. *
  37. * pull enable
  38. * 0: pull disable
  39. * 1: pull enable
  40. */
  41. #define IOC_PAD_PAD_CTL_PE_MASK (0x10U)
  42. #define IOC_PAD_PAD_CTL_PE_SHIFT (4U)
  43. #define IOC_PAD_PAD_CTL_PE_SET(x) (((uint32_t)(x) << IOC_PAD_PAD_CTL_PE_SHIFT) & IOC_PAD_PAD_CTL_PE_MASK)
  44. #define IOC_PAD_PAD_CTL_PE_GET(x) (((uint32_t)(x) & IOC_PAD_PAD_CTL_PE_MASK) >> IOC_PAD_PAD_CTL_PE_SHIFT)

  45. /**************************************************************
  46.         寄存器地址
  47. ***************************************************************/
  48. /* IOC base address */
  49. #define HPM_IOC_BASE (0xF4040000UL)
  50. /* IOC base pointer */
  51. #define HPM_IOC ((IOC_Type *) HPM_IOC_BASE)

  52. /**************************************************************
  53.         寄存器结构体定义
  54. ***************************************************************/
  55. typedef struct {
  56.     struct {
  57.         __RW uint32_t FUNC_CTL;                /* 0x0: ALT SELECT */
  58.         __RW uint32_t PAD_CTL;                 /* 0x4: PAD SETTINGS */
  59.     } PAD[492];
  60. } IOC_Type;

  61. /**************************************************************
  62.         gpio复用定义
  63. ***************************************************************/
  64. /* IOC_PB18_FUNC_CTL function mux definitions */
  65. #define IOC_PB18_FUNC_CTL_GPIO_B_18            IOC_PAD_FUNC_CTL_ALT_SELECT_SET(0)
  66. #define IOC_PB18_FUNC_CTL_UART1_CTS            IOC_PAD_FUNC_CTL_ALT_SELECT_SET(3)
  67. #define IOC_PB18_FUNC_CTL_CAN1_RXD             IOC_PAD_FUNC_CTL_ALT_SELECT_SET(7)
  68. #define IOC_PB18_FUNC_CTL_DAOL_N               IOC_PAD_FUNC_CTL_ALT_SELECT_SET(10)
  69. #define IOC_PB18_FUNC_CTL_DRAM_DQ_25           IOC_PAD_FUNC_CTL_ALT_SELECT_SET(12)
  70. #define IOC_PB18_FUNC_CTL_PWM1_P_1             IOC_PAD_FUNC_CTL_ALT_SELECT_SET(16)
  71. #define IOC_PB18_FUNC_CTL_XPI_SLV_ADQ_31       IOC_PAD_FUNC_CTL_ALT_SELECT_SET(30)
可见,risc-v处理器的寄存器配置套路是非常清楚的,和arm思路相同,步骤大同小异~~~~~

使用ide进行debug运行上述代码,截图如下:





更多回帖

发帖
×
20
完善资料,
赚取积分