0,前言

这节课主要讲裸机使用两个CPU跑不同的应用程序。总体来说难度不是很大。使用共享内存时两个CPU进行交互。后面将其烧写进SD卡。

1,搭建工程(BD)

这里只使用了uart,后面用到了SD卡。因此这里只需要将这两个勾选。设定好DDR3的类型,去掉PL端的时钟,即可生成顶层文件。这里在前面的章节已经有总结过。不再赘述。
这里提出来一种可以节约时间的方法。使用的时候可以不先将BIT文件导入到SDK工程中。而是直接launch SDK工程后在导入比特流文件。可以节省一定的时间。

2,知识储备

2.1AMP架构

AMP就是非对称多处理器。这种模式是在有多个处理器的情况下,CPU0跑一个程序,CPU1跑一个程序。然后两个通过共享内存进行数据交互。对应的有SMP 对称处理器架构

2.2地址空间的分配

下面是提供的ZYNQ地址空间的分配,在UG585中可以找到。我们在运行程序是需要对两个运行地址进行重新分配。

3,代码分析

首先建立一个工程命名为CPU0。建立一个共享内存。就是前面的OCM3。

    #include <stdio.h>#define COMM_VAL (*(volatile unsigned long *)(0xffff0000))//首先进行定义共享内存地址。因为我们需要访问其数据,因此加个*访问其寄存器中的地址int main(){COMM_VAL = 0;Xil_SetTlbAttributes(0xffff0000,0x14de2);//这个函数用于关闭1MB的cachewhile(1) {while(COMM_VAL == 1){}print("Hello CPU0\n\r");usleep(2000000);COMM_VAL = 1;}return 0;}

下面是关键字的定义。用于直接不想被优化的数据的定义。引荐博文C语言中volatile关键字的作用
很简单的,建立一个工程,然后写入代码。主要是对共享内存数据进行处理即可。然后检测数据是不是1.若是1.则进入死循环,不是1,就输出Hello CPU0后将其延时2秒赋值为1。这里是为了和CPU1同时进行的。代码如下。两个合起来看会很容易的理解。

#include <stdio.h>
#define COMM_VAL    (*(volatile unsigned long *)(0xffff0000))
int main()
{Xil_SetTlbAttributes(0xffff0000,0x14de2);while(1) {while(COMM_VAL == 0){}print("Hello CPU1\n\r");usleep(2000000);COMM_VAL = 0;}return 0;
}

这里需要进行的是地址空间的分配以及配置应用程序时候的设置。
地址空间的设置如下。这是CPU0地址空间的设置。

这是CPU1地址空间的设置。

这里在写CPU1的应用程序时候,需要进行的设置是

同时在debug的时候,下面的两个都要勾选上。

然后点击调试即可,这里调试的时候必须点击CPU1,他才会运转,要是你直接运行的话就可以直接看到现象。我们会发现。串口打印的数据两秒变化一次。

可以看到结果完全正确。

4,烧写进入SD卡

这里烧写进sd卡时候由于是需要两个CPU同时工作。因此在生成fsbl的时候要进行简单的设置。
修改Main函数为了启动core1,需要两个步骤,第一个把CPU1应用程序地址写入到0xfffffff0地址中,然后执行SEV指令启动加载CPU1应用程序。参考UG585的启动代码章节。
在main函数之上加入如下代码

#define sev() __asm__("sev")
#define CPU1STARTADR 0xFFFFFFF0
#define CPU1STARTMEM 0x2000000
void StartCpu1(void)
{#if 1fsbl_printf(DEBUG_GENERAL,"FSBL: Write the address of the application for CPU 1 to 0xFFFFFFF0\n\r");Xil_Out32(CPU1STARTADR, CPU1STARTMEM);dmb(); //waits until write has finishedfsbl_printf(DEBUG_GENERAL,"FSBL: Execute the SEV instruction to cause CPU 1 to wake up and jump to the application\n\r");sev();#endif
}
在load 镜像位置加入如图代码:StartCpu1();

将代码随意粘贴到主函数前面即可。然后在load 调用后打开CPU1即可。

接着直接生成即可。将BOOT.bin文件加载如sd卡,启动即可。

第三课--AMP架构双核应用程序开发和软中断处理(一)相关推荐

  1. 第四课--AMP架构双核应用程序开发和软中断处理(二)

    0,前言背景 这节课讲了中断.可能很多人和我一样不理解什么是中断.其实这个概念说起来很好理解,就是简单的停下来.可是又有什么用处?在系统设计中又处于什么样的一个地位呢? 这里引荐博文(不知道不翻墙能不 ...

  2. 快速入门丨篇三:如何进行运动控制器ZPLC程序开发?

    此前,正运动技术给大家讲了,运动控制器的"固件升级"以及"ZBasic程序开发",今天我们来学习一下运动控制器ZPLC程序开发. ZPLC是Zmotion运动控 ...

  3. C/S架构的应用程序开发实战(一)

    项目背景 近期需要开发一个对巨量的图片数据进行车辆品牌信息标注的工具,为了提高标注效率,准备先通过现有车辆品牌识别的算法模型进行下预标注,标注人员在此基础上进行审核和修改即可.另外,需要统计出各个品牌 ...

  4. 全新PHP程序开发在线工单管理系统源码,售后工单系统

    源码介绍 很多会员需要的在线工单系统,客户售后服务系统,php写的非常不错! 项目说明: 1.1 :客户管理:可实现对职员的管理,可添加职员,并对不同角色的职员分别进行授权及停用操作. 1.2 :客服 ...

  5. 微信小程序开发系列 (四) :微信小程序的页面跳转路由设计

    笔者由于工作需要,曾经参加过一个微信小程序同 SAP 系统集成的项目,因此从零开始学习了微信小程序的开发知识.这里通过系列文章把自己所学分享出来,希望对相关学习者有所帮助. 本教程前面三篇文章: 微信 ...

  6. 《程序开发心理学》笔记

    最近阅读了温伯格的<程序开发心理学>一书,非常有趣,作者试图用学术的方法去研究影响程序开发的因素,在这个过程中也提出了一些自己对程序开发的看法.书中对如何提高程序员团队的开发效率给出了作者 ...

  7. 一键搭建微信小程序开发环境 及demo运行(腾讯云上一键搭建node.js服务器环境,PHP,Java,.NET服务类似)

    一.首先准备下本地环境(本地就需要一个微信开发工具) 1.首先得有一个微信小程序账号,登陆微信小程序首页:mp.weixin.qq.com,点击右上角立即注册. 注册登陆后,首页填写一些小程序基本信息 ...

  8. 程序开发心理学(银年纪念版)(经典重读,与温伯格大师的思想共舞)

    程序开发心理学(银年纪念版)(经典重读,与温伯格大师的思想共舞) 基本信息 原书名: The Psychology of Computer Programming: Silver Anniversar ...

  9. 第三课.运算符与表达式

    第三课目录 运算符与表达式 算术运算符 关系运算符 逻辑运算符 德摩根律 使用断言assert 位运算符 补码 补码与位运算 赋值运算符 杂项运算符 运算符与表达式 数学是科技发展的基础,数学公式的意 ...

最新文章

  1. 2020-11-23(彻底理解KMP)
  2. 【web安全】Web应用隔离防护之Web弱口令爆破
  3. python中的非阻塞使用互斥锁
  4. Python学习笔记之变量
  5. 无法连接iphone软件更新服务器_NX许可证错误:无法连接至许可证服务器系统。SPLM_LICENSE_SERVER错误[15]...
  6. 计算机启动单元,快速启动计算机系统的方法和计算机的启动系统与流程
  7. grDevices | 如何在图形中使用数学表达式作为标注文本
  8. Graphics 单元中的类
  9. 使用Lingo做灵敏度分析
  10. php 之将图片转换base64编码(为百度ocr作准备,解决 image format error)
  11. jQuery源码解读一
  12. lammps教程:如何更清晰观察晶体结构?Ovito渲染技巧介绍
  13. c语言邮递员问题算法,中国邮递员问题的求解实例
  14. 广域网用什么软件可以更好地传输大文件和海量文件?
  15. Spurious Wakup
  16. 杭州电子科技大学acm--2012
  17. python工程师的职业规划_一名Python开发工程师的职业规划
  18. Qt编写的项目作品30-录音播放控件(雨田哥作品)
  19. python 列表迭代_Python | 以相反的顺序迭代列表
  20. BZOJ_3238_[Ahoi2013]差异_后缀自动机

热门文章

  1. 解决background图片拉伸问题
  2. python open() 方法 No such file or directory: 应该怎么解决
  3. MySQL的IFNULL解决判空问题
  4. 在同一窗口和同一选项卡中打开URL
  5. win10开机之后任务栏卡住了怎么办
  6. 更改项目project名称,与项目名称;
  7. 麦克纳姆轮辊子滚动速度分析
  8. 服务器 上传文件进度,Java动态显示文件上传进度实现代码
  9. 什么是陀螺仪的dr算法_PID控制器调参工具——DR-PID Tuning(Matlab GUI)
  10. 有关二级菜单缓慢效果出现(transition)