前面我们在介绍K210时提及到,K210芯片中有两个RISC-V核心,一般情况下,只有一个核心在运行,本章将介绍如何开启双核模式。
K210系统架构如下,可以看到其包含两个64位RISC-V核心,两个核心分别带有FPU处理单元,FPU(浮点运算单元)是集成于CPU中的专用于浮点运算的处理器。K210核心0和核心1都具备独立的FPU,满足IEEE754-2008标准,计算流程以流水线方式进行,具备很强的运算能力,每个FPU都具备除法器和平方根运算器,支持单精度和双精度浮点硬件加速运算。
K210提供了丰富的BSP调用
板级对应的头文件 bsp.h
bsp.h头文件是与平台相关的通用函数,核之间锁的相关操作。
提供获取当前运行程序的CPU核编号的接口以及启动第二个核的入口。
为用户提供以下接口:
? register_core1:向核心1注册函数,并启动核心1
? current_coreid:获取当前CPU的核心编号(0/1)
? read_cycle:获取CPU开机至今的时钟数。可以用使用这个函数精准的确定程序运行时钟。可以配合sysctl_clock_get_freq(SYSCTL_CLOCK_CPU)计算运行的时间。
? spinlock_lock:自旋锁,不可嵌套,不建议在中断使用,中断中可以使用spinlock_trylock。
? spinlock_unlock:自旋锁解锁。
? spinlock_trylock:获取自旋锁,成功获取锁会返回0,失败返回-1。
? corelock_lock:获取核间锁,核之间互斥的锁,同核内该锁会嵌套,只有异核之间会阻塞。不建议在中断使用该函数,中断中可以使用corelock_trylock。
? corelock_trylock:获取核间锁,同核时锁会嵌套,异核时非阻塞。成功获取锁会返回0,失败返回-1。
? corelock_unlock:核间锁解锁。
? sys_register_putchar:注册系统输出回调函数,printf时会调用该函数。系统默认使用UART3,如果需要修改UART则调用uart_debug_init函数。
? sys_register_getchar:注册系统输入回调函数,scanf时会调用该函数。系统默认使用UART3,如果需要修改UART则调用uart_debug_init函数。
? sys_stdin_flush:清理stdin缓存。
? get_free_heap_size:获取空闲内存大小。
? printk:打印核心调试信息。
新建一个hello_world的文件夹,在里面新建main.c,这次打印我们直接调用printf了哦
#include <bsp.h>
#include <sysctl.h>
int core1_function(void *ctx)
{
uint64_t core = current_coreid();
printf("Core %ld Hello world\n", core);
while(1);
}
int main(void)
{
sysctl_pll_set_freq(SYSCTL_PLL0, 800000000);
uint64_t core = current_coreid();
int data;
printf("Core %ld Hello world\n", core);
register_core1(core1_function, NULL);
/* Clear stdin buffer before scanf */
sys_stdin_flush();
scanf("%d", &data);
printf("\nData is %d\n", data);
while(1)
continue;
return 0;
}
代码写好后,我们开始编译,注意:如果你编译过程中出现错误,可以先make clean掉之前生成的过程文件,重新生成
cd build
//注意这里的目标文件目录改成gpio,和刚才新建的文件夹名称一致
cmake .. -DPROJ=hello_world -G "MinGW Makefiles"
make
烧录
然后来看看结果吧
本章介绍了K210是双核心CPU和系统调用,两个核心都可以单独运行,K210的SDK默认是运行核心0,核心1需要手动注册开启。