AI嵌入式K210项目(6)-开启双核模式

文章目录

  • 前言
  • 一、K210双核心和BSP介绍
  • 二、实验过程
    • 代码实现
  • 总结


前言

前面我们在介绍K210时提及到,K210芯片中有两个RISC-V核心,一般情况下,只有一个核心在运行,本章将介绍如何开启双核模式。

一、K210双核心和BSP介绍

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需要手动注册开启。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/627101.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

CXYGZL-程序员工作流,持续迭代升级中

概述 现在开源的工作流引擎&#xff0c;基本都是以BPMN.js为基础的&#xff0c;导致使用门槛过高&#xff0c;非专业人员无法驾驭。本工作流借鉴钉钉/飞书的方式&#xff0c;以低代码方式降低用户使用门槛&#xff0c;即使是普通企业用户也可以几分钟内就能搭建自己的工作流引…

CC工具箱使用指南:【获取所有字段信息】

一、简介 这个工具的目的简单易懂&#xff0c;就是获取选定要素图层的所有字段信息。 本身不对要素图层作任何处理&#xff0c;只是一个查看属性的工具。 问我要用在什么地方&#xff0c;我也不知道-_- 二、工具参数介绍 点击【信息获取】组里的【获取所有字段信息】工具&a…

Vue3中使用自定义指令

一&#xff0c;自定义指令&#xff1a; 应用场景&#xff1a;禁用按钮多次点击 1.vue2 a. src/libs/preventClick.js import Vue from vue const preventClick Vue.directive(preventClick, {inserted: function (el, binding) {el.addEventListener(click, () > {if (!el…

网络协议与攻击模拟_04ICMP协议与ICMP重定向

ICMP协议是网络层协议&#xff0c; 利用ICMP协议可以实现网络中监听服务和拒绝服务&#xff0c;如 ICMP重定向的攻击。 一、ICMP基本概念 1、ICMP协议 ICMP是Internet控制报文协议&#xff0c;用于在IP主机、路由器之间传递控制消息&#xff0c;控制消息指网络通不通、主机是…

windows系统下docker软件中使用ubuntu发行版本的linux系统

1.软件下载 官网下载地址 下载安装之后&#xff0c;再去微软商店下载wsl软件&#xff0c;可以直接用&#xff0c;或者也可以使用命令行拉取&#xff08;下面会讲&#xff09; 2.在docker里面创建容器的两种方法 2.1.命令行创建 前言&#xff1a;输入 winr 打开命令行进行下面…

【经典算法】有趣的算法之---遗传算法梳理

every blog every motto: You can do more than you think. 0. 前言 遗传算法是一种基于自然选择和遗传机制的优化算法&#xff0c;因此它通常被用于求解各种最优化问题&#xff0c;例如函数优化、特征选择、图像处理等。 一言以蔽之&#xff1a; 将数学中的优化问题&#xf…

Rust 基础语法

本章主要了解可变变量、不可变变量、函数、基本类型、注释、所有权、借用。 1、定义变量&#xff0c;Rust中有可变变量和不可变变量的区别&#xff0c;不废话上代码 fn main() {//创建一个不可变的变量xlet x5;//创建一个可变的变量ylet mut y6;x10;y11;//打印变量x、y的值pr…

高级分布式系统目录汇总

临近《高级分布式系统》考试&#xff0c;所以一边复习((⊙o⊙)…&#xff0c;其实是预习&#xff0c;哈哈^_^)&#xff0c;一边写高级分布式博客。先将高级分布式章节以及相关博客罗列如下&#xff0c;欢迎和大家一起学习。资料部分参考上了以下教材&#xff1a; 分布式实时系统…

接口interface--java学习笔记

认识接口 java提供了一个关键字interface&#xff0c;用这个关键字可以定义出一个特殊的结构&#xff1a;接口在接口里面定义的变量&#xff0c;不管加不加public static final修饰都默认为常量&#xff0c;必须赋初值在接口里面定义的方法&#xff0c;不管加不加public abstr…

武汉灰京文化:抓住用户心理,游戏推广不可或缺的前提

在当今激烈竞争的游戏市场中&#xff0c;了解目标用户成为游戏推广的不可或缺的前提。不同类型的游戏适合不同的用户群体&#xff0c;因此通过深入研究用户画像&#xff0c;准确定位目标用户群体&#xff0c;成为游戏成功推广的关键一环。游戏推广不仅仅是让更多的人知道游戏的…

MOJO交互

文章目录 Mojo不仅非常适合编写高性能代码&#xff0c;而且还允许我们利用庞大的Python库和工具生态系统。有了无缝的Python互操作性&#xff0c;Mojo可以使用Python做它擅长的事情&#xff0c;尤其是gui&#xff0c;而不会牺牲关键代码的性能。让我们以经典的Mandelbrot集合算…

运筹说 第84期 | 网络计划-网络图的基本概念

自华罗庚教授将网络计划技术引入我国&#xff0c;网络计划已取得巨大发展。本期开始&#xff0c;小编将从网络图基本概念、时间参数计算、网络计划优化和图解评审法等方面对网络计划进行系统的介绍。 01前言 20世纪50年代以来&#xff0c;产生了许多计划管理的新方法&#xf…

【java八股文】之计算机网络系列篇

1、TCP/IP和UDP模型 TCP/IP分层&#xff08;4层&#xff09;&#xff1a;应用层&#xff0c;传输层&#xff0c;网络层&#xff0c;数据链路层 网络的七层架构 &#xff08;7层&#xff09;&#xff1a;应用层&#xff0c;表示层&#xff0c;会话层&#xff0c;传输层&#xff…

【健康小贴士】关节炎是不是冻出来的?

大家冬天肯定被父母唠叨过&#xff1a; 「天气这么冷&#xff0c;裤子穿这么短&#xff0c;小心得关节炎&#xff01;」 ❌这种说法其实是不对的或者并不全面&#xff0c;答案来了&#x1f440;

快快销ShopMatrix 分销商城多端uniapp可编译5端 - 佣金倍数提现

本文来自应用中心-9999款应用在线选购 "佣金倍数提现"这个概念在不同的上下文中可能有不同的含义&#xff0c;但通常它涉及到基于用户赚取的佣金来设定提现条件。这是一种常见的机制&#xff0c;尤其是在那些提供佣金或回扣的平台上&#xff0c;如联盟营销、金融交易…

数字前端/FPGA设计——握手与反压问题

声明&#xff1a;本文来自0431大小回 前言&#xff1a;在芯片设计或者FPGA设计过程中&#xff0c;流水设计是经常用到的&#xff0c;但是考虑数据安全性&#xff0c;需要与前后级模块进行握手通信&#xff0c;这时候就需要对流水数据进行反压处理&#xff0c;本文将具体介绍握手…

开源内网穿透工具FRP配置SSH和网站访问,构建本地私有云NAS,非常详细的配置细节,复刻即可成功

简介&#xff1a; FRP 是一个可用于内网穿透的高性能的反向代理应用&#xff0c;支持 tcp, udp 协议&#xff0c;为 http 和 https 应用协议提供了额外的能力&#xff0c;且尝试性支持了点对点穿透。名称其实就是使用了 Fast Reverse Proxy 的首字母缩写。 需求&#xff1a; 有…

基于英特尔傲腾持久内存的下一代高性能计算存储系统DAOS

本文内容来自 Intel极限存储架构和开发首席工程师 梁震 在2021CCF全国高性能计算学术年会&#xff08;CCF HPC China 2021&#xff09;上的演讲资料&#xff0c;供大家参考。 目录 - 分布式异步对象存储(DAOS)的系统架构 - DAOS系统栈结构 - DAOS 的部署方式 - DAOS 存储服…

WebGL在家居设计领域中的应用

WebGL&#xff08;Web Graphics Library&#xff09;是一种用于在Web浏览器中进行3D图形渲染的JavaScript API。在家居设计方面&#xff0c;WebGL可以提供一些强大的应用&#xff0c;使用户能够交互式地浏览和体验设计方案。以下是一些家居设计领域中WebGL的应用&#xff0c;希…

蓝桥杯:随意组合

题目描述&#xff1a; 算法思路&#xff1a; 主要是将其中一个数组进行全排列&#xff0c;16中排列顺序&#xff0c;再与 另外一个数组进行匹配求和。在这里就要用到next_permutation()函数&#xff0c;具体用法就是直接用数组a[]&#xff0c;进行排序next_permutation(a&…