1.前言
使用先楫,當(dāng)然就是看上它的高性能,順便了解了一下晶心D45內(nèi)核,發(fā)現(xiàn)華人都有一個特點(diǎn),要是掌握了一個mcu的設(shè)計(jì)精髓,就會盡量多的開掘出更高的性能,更強(qiáng)的外設(shè),繼續(xù)卷死在行業(yè)作威作福的lw。那么拿到先楫開發(fā)板,當(dāng)然要跑跑分,順便與一眾芯片做做比較。
2.生成coremark工程
1.這次選擇生成flash里面執(zhí)行的工程。
> generate_project -b hpm6750evkmini -t flash_xip
2.使用SEGGER Embedded Studio編譯下載,并運(yùn)行。
好家伙,單核跑出4553分,大家可能只看分?jǐn)?shù)沒啥概念,看看常用的芯片跑分對比:
rt1052能跑出3000多分,nxp官方都說是高性能,搞了很多跑分文章,看來已經(jīng)被秒殺。
STM32F1只能跑出108分。
i.mx6ul跑出1500分。
呼聲很高的全志D1可以跑出2240分。
相比之下,先輯這HPM6750可真夠優(yōu)秀的?。?/strong>
有了這么高的性能,可以寫比較復(fù)雜的計(jì)算或者控制程序了。
3.生成FreeRTOS工程
有了高性能還不夠,需要加上RTOS,高性能才能被充分利用。仍然借助SDK例子。
start_cmd.cmd進(jìn)入\sdk_env_v0.11.0\hpm_sdk\samples\rtos
> generate_project -b hpm6750evkmini -t flash_xip
4.代碼分析
使用使用SEGGER Embedded Studio打開,并對代碼進(jìn)行簡單修改。freertos建立task,運(yùn)行task代碼分析不再贅述。
#include "FreeRTOS.h"
#include "task.h"
#include
#include "board.h"
#include "hpm_gpio_drv.h"
#define task1_PRIORITY (configMAX_PRIORITIES - 5U)
#define task2_PRIORITY (configMAX_PRIORITIES - 4U)
volatile bool led_on;
static void task1(void *pvParameters)
{
for (;;) {
printf("LED is %s.\n", led_on ? "on" : "off");
vTaskDelay(1000);
}
}
static void task2(void *pvParameters)
{
for (;;) {
gpio_toggle_pin(BOARD_LED_GPIO_CTRL, BOARD_LED_GPIO_INDEX, BOARD_LED_GPIO_PIN);
printf("task2: Toggle the led pin level\n");
led_on = !led_on;
vTaskDelay(1000);
}
}
int main(void)
{
board_init();
board_init_gpio_pins();
gpio_set_pin_output(BOARD_LED_GPIO_CTRL, BOARD_LED_GPIO_INDEX, BOARD_LED_GPIO_PIN);
gpio_write_pin(BOARD_LED_GPIO_CTRL, BOARD_LED_GPIO_INDEX, BOARD_LED_GPIO_PIN, BOARD_LED_ON_LEVEL);
led_on = true;
if (xTaskCreate(task1, "task1", configMINIMAL_STACK_SIZE + 256U, NULL, task1_PRIORITY, NULL) != pdPASS) {
printf("Task1 creation failed!.\n");
for (;;) {
;
}
}
if (xTaskCreate(task2, "task2", configMINIMAL_STACK_SIZE + 256U, NULL, task2_PRIORITY, NULL) != pdPASS) {
printf("Task2 creation failed!.\n");
for (;;) {
;
}
}
vTaskStartScheduler();
for (;;) {
;
}
return 0;
}
這里順便分析一下gpio的初始化方法:
/**************************************************************
主要分析一下main函數(shù)中的gpio初始化函數(shù)
***************************************************************/
board_init_gpio_pins();
/**************************************************************
函數(shù)原型在board.c中定義
***************************************************************/
void board_init_gpio_pins(void)
{
init_gpio_pins();
}
//borad.c中定義
void init_gpio_pins(void)
{
uint32_t pad_ctl = IOC_PAD_PAD_CTL_PE_SET(1) | IOC_PAD_PAD_CTL_PS_SET(1);
/* Green LED*/
HPM_IOC->PAD[IOC_PAD_PB18].FUNC_CTL = IOC_PB18_FUNC_CTL_GPIO_B_18;
HPM_IOC->PAD[IOC_PAD_PB18].PAD_CTL = pad_ctl;
}
/**************************************************************
寄存器配置宏命令
***************************************************************/
/*
* PS (RW)
*
* pull select
* 0: pull down
* 1: pull up
*/
#define IOC_PAD_PAD_CTL_PS_MASK (0x800U)
#define IOC_PAD_PAD_CTL_PS_SHIFT (11U)
#define IOC_PAD_PAD_CTL_PS_SET(x) (((uint32_t)(x) << IOC_PAD_PAD_CTL_PS_SHIFT) & IOC_PAD_PAD_CTL_PS_MASK)
#define IOC_PAD_PAD_CTL_PS_GET(x) (((uint32_t)(x) & IOC_PAD_PAD_CTL_PS_MASK) >> IOC_PAD_PAD_CTL_PS_SHIFT)
/*
* PE (RW)
*
* pull enable
* 0: pull disable
* 1: pull enable
*/
#define IOC_PAD_PAD_CTL_PE_MASK (0x10U)
#define IOC_PAD_PAD_CTL_PE_SHIFT (4U)
#define IOC_PAD_PAD_CTL_PE_SET(x) (((uint32_t)(x) << IOC_PAD_PAD_CTL_PE_SHIFT) & IOC_PAD_PAD_CTL_PE_MASK)
#define IOC_PAD_PAD_CTL_PE_GET(x) (((uint32_t)(x) & IOC_PAD_PAD_CTL_PE_MASK) >> IOC_PAD_PAD_CTL_PE_SHIFT)
/**************************************************************
寄存器地址
***************************************************************/
/* IOC base address */
#define HPM_IOC_BASE (0xF4040000UL)
/* IOC base pointer */
#define HPM_IOC ((IOC_Type *) HPM_IOC_BASE)
/**************************************************************
寄存器結(jié)構(gòu)體定義
***************************************************************/
typedef struct {
struct {
__RW uint32_t FUNC_CTL; /* 0x0: ALT SELECT */
__RW uint32_t PAD_CTL; /* 0x4: PAD SETTINGS */
} PAD[492];
} IOC_Type;
/**************************************************************
gpio復(fù)用定義
***************************************************************/
/* IOC_PB18_FUNC_CTL function mux definitions */
#define IOC_PB18_FUNC_CTL_GPIO_B_18 IOC_PAD_FUNC_CTL_ALT_SELECT_SET(0)
#define IOC_PB18_FUNC_CTL_UART1_CTS IOC_PAD_FUNC_CTL_ALT_SELECT_SET(3)
#define IOC_PB18_FUNC_CTL_CAN1_RXD IOC_PAD_FUNC_CTL_ALT_SELECT_SET(7)
#define IOC_PB18_FUNC_CTL_DAOL_N IOC_PAD_FUNC_CTL_ALT_SELECT_SET(10)
#define IOC_PB18_FUNC_CTL_DRAM_DQ_25 IOC_PAD_FUNC_CTL_ALT_SELECT_SET(12)
#define IOC_PB18_FUNC_CTL_PWM1_P_1 IOC_PAD_FUNC_CTL_ALT_SELECT_SET(16)
#define IOC_PB18_FUNC_CTL_XPI_SLV_ADQ_31 IOC_PAD_FUNC_CTL_ALT_SELECT_SET(30)
可見,risc-v處理器的寄存器配置套路是非常清楚的,和arm思路相同,步驟大同小異~~~~~
使用ide進(jìn)行debug運(yùn)行上述代碼,截圖如下:
審核編輯:湯梓紅
-
mcu
+關(guān)注
關(guān)注
146文章
17199瀏覽量
351922 -
開發(fā)板
+關(guān)注
關(guān)注
25文章
5093瀏覽量
97802 -
FreeRTOS
+關(guān)注
關(guān)注
12文章
484瀏覽量
62274
發(fā)布評論請先 登錄
相關(guān)推薦
評論