DSP 开发例程: 单镜像多核引导

目录

  • DSP 开发例程: 单镜像多核引导
    • 新建工程
    • 源码编辑
      • multicore_boot.c
    • config.h
    • os.c
    • main.c
    • 测试

DSP 开发例程: 单镜像多核引导

此例程实现在 EVM6678L 开发板上将单镜像应用程序进行多核引导, 核0-核4 分别控制一个LED 闪烁, 并通过串口打印日志信息. 例程源码可从我的 gitee 仓库上克隆或下载. 点击 DSP 开发教程(0): 汇总查看其他例程说明.

新建工程

此示例工程直接在 logbuf_print_to_uart 工程基础上修改.

  • 选中 logbuf_print_to_uart 工程, 右键选择 Copy 或 使用快捷键 Ctrl+C 复制工程.

在这里插入图片描述

  • 在工程浏览视图中, 右键选择 Paste 或使用快捷键 Ctrl+V 粘贴工程.
    在这里插入图片描述
    在弹出的 Copy Project 对话框中 修改工程名为: multicore_boot, 点击 OK.
    在这里插入图片描述
  • 删除 multicore_boot 工程中的 Debug目录, 右键选择 Build Project, 编译此工程.

源码编辑

multicore_boot.c

新建名为 multicore_boot.c的源文件, 文件内容如下:

#include <ti/csl/csl_bootcfgAux.h>

#define CORE_0_MAGIC_ADDR (0X1087FFFC)

extern unsigned int  _c_int00(void);

void multicore_boot()
{
	unsigned int i;

	CSL_BootCfgUnlockKicker();
	// 拷贝 core0 L2SRAM 数据到其他核心
	for (i = 1; i < 8; i++)
	{
		memcpy((void *)(CSL_DSP0_L2_SRAM_REGS+0x01000000*i), (void *)CSL_DSP0_L2_SRAM_REGS, 0x70000);
		*(volatile unsigned int *)(CORE_0_MAGIC_ADDR + 0x01000000*i) = (unsigned int)_c_int00;
		CSL_BootCfgGenerateInterDSPInterrupt(i, 0);
	}

	CSL_BootCfgLockKicker();
}

multicore_boot() 函数由核0执行, 实现以下功能:

  • 将核0的 L2SRAM 中的内容复制到其他核心的 L2SRAM中;
  • 向其他核心发送 IPC中断, 唤醒其他核心.

config.h

新建名为 config.h 的头文件, 在其中输入如下内容:

#ifndef CONFIG_H_
#define CONFIG_H_

#define PLATFORM_UART_HW_SEM 4
#define PLATFORM_LED_HW_SEM 5


#endif /* CONFIG_H_ */

其中, 定义了两个宏, 分别用于多核在 UARTLED 外设资源抢占时, 使用哪个硬件信号量进行资源保护.

os.c

修改 os_systemFlush() 函数, 在执行System_flush()前后加入硬件信号量的请求和释放.

void os_systemFlush()
{
	if (logger0)
		myLoggerBuf_flush(logger0);

	if ((CSL_semAcquireDirect (PLATFORM_UART_HW_SEM)))
	{
		System_flush();
		CSL_semReleaseSemaphore (PLATFORM_UART_HW_SEM);
	}
}

main.c

修改 EVM_init() 函数, 调用 multicore_boot() 函数实现多核引导. 平台初始化和多核引导只由核0 完成.

void EVM_init()
{
	platform_init_flags init_flags;
	platform_init_config init_config;

	if (platform_get_coreid() == 0)
	{
		// plaform initialize
		memset(&init_flags, 1, sizeof(platform_init_flags));
		init_flags.phy = 0;
		memset(&init_config, 0, sizeof(platform_init_config));
		if (platform_init(&init_flags, &init_config) != Platform_EOK)
		{
			printf("Platform failed to initialize, errno = 0x%x \n", platform_errno);
			while(1);
		}
		platform_uart_init();

		multicore_boot();
	}
}

修改 task_ledFlash() 函数, 在调用 platform_led() 函数前后加入硬件信号量的请求和释放.

Void task_ledFlash(UArg a0, UArg a1)
{
    int i = 1;
    int id = platform_get_coreid();
    Log_info0("enter task_ledFlash().");

    if (id < 4)
    {
        while(1)
        {
            while ((CSL_semAcquireDirect (PLATFORM_LED_HW_SEM)) == 0);
            platform_led(id, PLATFORM_LED_ON, PLATFORM_USER_LED_CLASS);
            CSL_semReleaseSemaphore (PLATFORM_LED_HW_SEM);
            Log_info2("LED %d ON at %d times.", id, i);
            Task_sleep(500);

            while ((CSL_semAcquireDirect (PLATFORM_LED_HW_SEM)) == 0);
            platform_led(id, PLATFORM_LED_OFF, PLATFORM_USER_LED_CLASS);
            CSL_semReleaseSemaphore (PLATFORM_LED_HW_SEM);
            Log_info2("LED %d OFF at %d times.", id, i);
            Task_sleep(500);
            i++;
        }
    }
}

保存对上述文件的修改.

测试

此处我使用 IBL-TFTP 引导方式对核0进行应用程序的加载和引导. 你也可以使用其他的引导方式. 请参考:EVM6678L 开发教程: IBL-TFTP 引导 elf 文件

下图是EVM6678L开发板串口终端打印的日志信息. 多个核心的日志时间戳不一定按时间先后顺序排列

在这里插入图片描述

同时应该可以看到开发板上的四个LED灯以1秒周期闪烁.

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

今日温馨早安问候语,祝大家平安健康早安吉祥

用清晨的阳光沐浴&#xff0c;给你舒展;用清新的空气洗漱&#xff0c;给你舒心;伴清莹的雨露散步&#xff0c;给你舒情;向美好的一天欢呼&#xff0c;给你舒怀&#xff0c;用快乐的词汇凝聚&#xff0c;给你祝福&#xff0c;祝你在绚丽的晨光中走好每一天。朋友&#xff0c;早安…

PyCharm社区版安装

PyCharm社区版安装 到中国官网下载 https://www.jetbrains.com/zh-cn/pycharm/download/?sectionwindows 首次创建项目&#xff0c;会自动下载安装Python 3.9 社区版的区别 社区版的区别

HTTP和HTTPS本质区别——SSL证书

HTTP和HTTPS是两种广泛使用的协议&#xff0c;尽管它们看起来很相似&#xff0c;但是它们在网站数据传输的安全性上有着本质上的区别。 HTTP是明文传输协议&#xff0c;意味着通过HTTP发送的数据是未经加密的&#xff0c;容易受到拦截、窃听和篡改的风险。而HTTPS通过使用SSL或…

vue 获取上一周和获取下一周的日期时间

效果图&#xff1a; 代码 <template><div><div style"padding: 20px 0;"><div style"margin-left: 10px; border-left: 5px solid #0079fe; font-size: 22px; font-weight: 600; padding-left: 10px">工作计划</div><di…

使用 Docker 部署高可用 MongoDB 分片集群

使用 Docker 部署 MongoDB 集群 Mongodb 集群搭建 mongodb 集群搭建的方式有三种&#xff1a; 主从备份&#xff08;Master - Slave&#xff09;模式&#xff0c;或者叫主从复制模式。副本集&#xff08;Replica Set&#xff09;模式。分片&#xff08;Sharding&#xff09;…

网络协议--TCP的超时与重传

21.1 引言 TCP提供可靠的运输层。它使用的方法之一就是确认从另一端收到的数据。但数据和确认都有可能会丢失。TCP通过在发送时设置一个定时器来解决这种问题。如果当定时器溢出时还没有收到确认&#xff0c;它就重传该数据。对任何实现而言&#xff0c;关键之处就在于超时和重…

Mac 上安装 Emscripten

背景&#xff1a;Web 端需要使用已有的 C 库&#xff0c;需要将 C 项目编译成 WebAssembly(.wasm) 供 js 调用。 Emscripten 可以将 C 编译成 .wasm 一、下载源码 # 下载 emsdk 源码 git clone https://github.com/emscripten-core/emsdk.git# 下载完成后进入到 emsdk 项目根…

2021-arxiv-LoRA Low-Rank Adaptation of Large Language Models

2021-arxiv-LoRA Low-Rank Adaptation of Large Language Models Paper: https://arxiv.org/abs/2106.09685 Code: https://github.com/microsoft/LoRA 大型语言模型的LoRA低秩自适应 自然语言处理的一个重要范式包括对通用领域数据的大规模预训练和对特定任务或领域的适应。…

不容错过的2023年度线框图工具Top 8

线框图工具可以快速呈现设计师的灵感。在任何项目的开始阶段&#xff0c;选择一个方便的线框图工具都是最好的选择。如今&#xff0c;线框图工具的出现并不夸张。各种工具都很容易获得&#xff0c;但选择太多确实很容易给设计师的选择带来困难。 买东西都讲性价比&#xff0c;…

电商课堂|5分钟了解电商数据分析完整流程,建议收藏!

账户效果下降&#xff0c;如何能够快速找到问题并优化调整&#xff1f; 相信百分之90%的竞价员都会说&#xff1a;“做数据分析。” 没错&#xff0c;数据分析能够帮助我们快速锁定问题所在&#xff0c;确定优化方向&#xff0c;还可以帮助我们找到流量控制的方向。那么做电商&…

[RISC-V]verilog

小明教IC-1天学会verilog(7)_哔哩哔哩_bilibili task不可综合&#xff0c;function可以综合

206.反转链表

206.反转链表 力扣题目链接(opens new window) 题意&#xff1a;反转一个单链表。 示例: 输入: 1->2->3->4->5->NULL 输出: 5->4->3->2->1->NULL 双双指针法&#xff1a; 创建三个节点 pre(反转时的第一个节点)、cur(当前指向需要反转的节点…

CodeWhisperer 初体验-手把手教导 给你飞一般的体验!

文章作者&#xff1a;燛衣 CodeWhisperer 有以下几个主要用途&#xff1a; 解决编程问题&#xff1a;CodeWhisperer 可以帮助您解决遇到的编程问题。您可以描述您的问题或需求&#xff0c;CodeWhisperer 将尽力提供相关的解决方案、代码示例或建议。无论您是遇到了语法错误、逻…

2023年十大地推网推拉新接单平台,都是一手单和官方渠道

2023年做拉新推广的地推人员&#xff0c;一定不要错过这十个接单平台&#xff0c;助你轻松找到一手单&#xff0c;这10个平台分别是&#xff1a; &#xff08;主推&#xff1a;聚量推客&#xff09; 我们也拿到了一手邀请码&#xff1a;000000 1&#xff1a;聚量推客 “聚量推…

【LeetCode】每日一题 2023_11_1 参加会议的最多员工数(没做出来)

文章目录 刷题前唠嗑题目&#xff1a;参加会议的最多员工数题目描述代码与解题思路纳入收藏夹 结语 刷题前唠嗑 好好好&#xff0c;这么玩是吧&#xff0c;11 月刚准备开始刷每日一题&#xff0c;就给我来了一道 hard&#xff0c;我连题目都看不懂他在讲些什么&#xff0c;但是…

YApi接口管理平台远程代码执行漏洞复现

一、简介 YAPI是由去哪儿网移动架构组(简称YMFE&#xff0c;一群由FE、iOS和Android工程师共同组成的最具想象力、创造力和影响力的大前端团队)开发的可视化接口管理工具&#xff0c;是一个可本地部署的、打通前后端及QA的接口管理平台。YAPI旨在为开发、产品和测试人员提供更优…

CVE-2018-8174 IE浏览器远程代码执行漏洞

一、漏洞简介 该漏洞影响最新版本的IE浏览器及使用了IE内核的应用程序。用户在浏览网页或打开Office文档时都可能中招&#xff0c;最终被黑客植入后门木马完全控制电脑。微软在4月20日早上确认此漏洞&#xff0c;并于5月8号发布了官方安全补丁&#xff0c;对该0day漏洞进行了修…

【数智化案例展】江苏兴达——智昌蜂脑平台助力产业数智化腾飞

‍ 智昌集团案例 本项目案例由智昌集团投递并参与数据猿与上海大数据联盟联合推出的《2023中国数智化转型升级创新服务企业》榜单/奖项”评选。 ‍数据智能产业创新服务媒体 ——聚焦数智 改变商业 江苏兴达钢帘线股份有限公司是子午线轮胎用钢帘线的专业生产商&#xff0c;经…

【java学习—十一】注解:Annotation(3)

文章目录 1. 相关概念2. 基本的Annotation3. 自定义Annotation 注意&#xff1a;注解这部分内容&#xff0c;了解即可 1. 相关概念 从 JDK 5.0 开始 , Java 增加了对元数据 (MetaData) 的支持 , 也就是 Annotation( 注释 )Annotation 其实就是代码里的特殊标记 , 这些标记可以…

爱写bug的小邓程序员个人博客

博客网址: http://www.006969.xyz 欢迎来到我的个人博客&#xff0c;这里主要分享我对于前后端相关技术的学习笔记、项目实战经验以及一些技术感悟。 在我的博客中&#xff0c;你将看到以下主要内容&#xff1a; 技术文章 我将会分享我在学习前后端技术过程中的一些感悟&am…