找回密码
 注册
关于网站域名变更的通知
查看: 388|回复: 1
打印 上一主题 下一主题

AMP架构双核应用程序开发和软中断处理(1)

[复制链接]

该用户从未签到

跳转到指定楼层
1#
发表于 2020-11-17 16:16 | 只看该作者 |只看大图 回帖奖励 |倒序浏览 |阅读模式

EDA365欢迎您登录!

您需要 登录 才可以下载或查看,没有帐号?注册

x
0,前言
% f( Q$ b0 I: f! c7 r这节课主要讲裸机使用两个CPU跑不同的应用程序。总体来说难度不是很大。使用共享内存时两个CPU进行交互。后面将其烧写进SD卡。1 T9 a+ q& e; c5 [

9 p8 Z( ?* t% Y1,搭建工程(BD)& U! u1 h5 m4 z, O& Y; Z) U. l
这里只使用了uart,后面用到了SD卡。因此这里只需要将这两个勾选。设定好DDR3的类型,去掉PL端的时钟,即可生成顶层文件。这里在前面的章节已经有总结过。不再赘述。6 @8 n. f+ h: |( O4 ^9 _6 A
这里提出来一种可以节约时间的方法。使用的时候可以不先将BIT文件导入到SDK工程中。而是直接launch SDK工程后在导入比特流文件。可以节省一定的时间。4 r# e0 A& `8 r0 N9 [2 y7 o/ N
8 \$ _2 _3 W# i) P, E( O
2,知识储备5 J+ [' a+ X+ ?9 F1 _6 O. x% q
2.1AMP架构
" ?0 @9 _5 y4 uAMP就是非对称多处理器。这种模式是在有多个处理器的情况下,CPU0跑一个程序,CPU1跑一个程序。然后两个通过共享内存进行数据交互。对应的有SMP 对称处理器架构+ V2 s( B4 H: g; B( s

6 `1 j& k  }1 F5 V+ E- R2.2地址空间的分配/ X  i8 Z9 o( v
下面是提供的ZYNQ地址空间的分配,在UG585中可以找到。我们在运行程序是需要对两个运行地址进行重新分配。: N% U" y8 n9 g! X/ L) m

# H) m2 s0 B" l( [, p4 z9 ]2 }( D: X
3,代码分析7 V! R/ C6 {9 P4 s
首先建立一个工程命名为CPU0。建立一个共享内存。就是前面的OCM3。
( U5 G# d6 ?. n: O& d6 s, X) Y- H  g# T7 Y
    #include <stdio.h>
( n5 D) w$ a0 l9 \    #define COMM_VAL        (*(volatile unsigned long *)(0xffff0000))4 s3 W! O+ H4 b9 S$ t( j; T2 `
    //首先进行定义共享内存地址。因为我们需要访问其数据,因此加个*访问其寄存器中的地址
$ v( V8 Y- m' e9 q# D& Q1 r    int main()1 g+ \0 T; m& P: S* B$ v& _) U
    {
0 S. @0 M' e- D7 h# y            COMM_VAL = 0;
! Q- Z  S$ a( G2 h9 O; x            Xil_SetTlbAttributes(0xffff0000,0x14de2);  a' G8 J% K9 ?/ L% r/ U1 T
            //这个函数用于关闭1MB的cache
* T5 l# a+ }  l. x* S: P$ \: ~. L. {            while(1) {
+ R* r4 T  o9 `; e2 s7 h. m                    while(COMM_VAL == 1){
/ N$ {  F1 K2 v" X6 R  I                    }9 U; l* q* G2 [8 t8 v! U3 U  F2 J
                    print("Hello CPU0\n\r");4 }* P- D6 Y9 [2 z0 Q, L' R
                    usleep(2000000);7 Y) v$ z' G" r$ r, e' s$ v
                    COMM_VAL = 1;( X2 v6 u4 w. x  M& E, w" G
            }0 _9 A/ }( x9 H- @" P5 L8 n
        return 0;
0 G, g7 D! r% Y; \2 q( O" B' [: A    }3 ]& ^1 c8 r8 v% F. V
$ S+ k) A; B* p; u' N/ U
& O" z, L: ]% }0 }8 j) g4 v
下面是关键字的定义。用于直接不想被优化的数据的定义。引荐博文C语言中volatile关键字的作用
6 S& ^% r. ]$ E9 c: |0 |很简单的,建立一个工程,然后写入代码。主要是对共享内存数据进行处理即可。然后检测数据是不是1.若是1.则进入死循环,不是1,就输出Hello CPU0后将其延时2秒赋值为1。这里是为了和CPU1同时进行的。代码如下。两个合起来看会很容易的理解。* {6 N* [" j/ x- ~
. `; Q/ C$ y% O( w0 S: W' |
#include <stdio.h>
5 g- \4 j) Z4 t6 |0 j- v) q#define COMM_VAL        (*(volatile unsigned long *)(0xffff0000))- `; ~# Y( ]: C& {, g
int main()
) p) Z% {$ Z: I* c, M+ e9 m8 s{
7 Q; N- L8 z9 w- z# y6 Z" ?$ z        Xil_SetTlbAttributes(0xffff0000,0x14de2);2 X6 O" a! S: T. `8 ]/ X
        while(1) {
- d$ \" W  P# L- i8 X2 g  R4 t% a+ ^. i                while(COMM_VAL == 0){5 ?) H" p7 @+ F! f* V9 g3 p. L
                }
0 n6 [* w# {7 w7 j* C4 y                print("Hello CPU1\n\r");" |6 b; u. C  j6 |& C
                usleep(2000000);
, x6 N) c4 A* d" Z6 e$ L( c/ q                COMM_VAL = 0;
! l9 Z$ B9 b1 z" K8 a        }- Q9 @6 V$ d& r' [
    return 0;6 V0 X2 o. b2 j! F
}
: I2 ^/ ^# z) F3 J( r1 B9 @' Y# S
" k- b' Y4 ~' I! r( {
  ^& T! J0 Q2 x7 v5 ~这里需要进行的是地址空间的分配以及配置应用程序时候的设置。
) r/ u1 B2 _' y9 {0 Z" d  b地址空间的设置如下。这是CPU0地址空间的设置。
5 z8 \/ x) V( U. d, \
" M- p7 a' p3 i: X' x2 c* {8 `这是CPU1地址空间的设置。
$ v6 `+ o$ N# ?. H6 K
! l) p5 ~" L* L- e5 r  U这里在写CPU1的应用程序时候,需要进行的设置是
" S6 ?0 j6 q9 ]. m, p6 [7 V7 J & e: A/ K1 F* a8 H
同时在debug的时候,下面的两个都要勾选上。
% m- q0 A3 y1 ~5 i
) L5 D& b+ v" P. ~% j5 ?5 j然后点击调试即可,这里调试的时候必须点击CPU1,他才会运转,要是你直接运行的话就可以直接看到现象。我们会发现。串口打印的数据两秒变化一次。5 E0 a8 |; G# i. C; q- G
- b% y$ i5 C5 Q5 ^
可以看到结果完全正确。  _$ ?9 b6 z  E

1 @) U3 [1 h! |- M5 Z4 @  Z) D$ g4,烧写进入SD卡
2 l3 c( W- z. M% s) s这里烧写进sd卡时候由于是需要两个CPU同时工作。因此在生成fsbl的时候要进行简单的设置。
1 v8 c& |! T+ N6 J0 V修改Main函数为了启动core1,需要两个步骤,第一个把CPU1应用程序地址写入到0xfffffff0地址中,然后执行SEV指令启动加载CPU1应用程序。参考UG585的启动代码章节。
) P0 e9 P: H/ {7 [2 _8 c在main函数之上加入如下代码
2 K" _$ k/ g7 E7 g. j
& o2 K: |" u! M4 h. [#define sev() __asm__("sev")
- f! E/ f& G: m& m3 W/ a#define CPU1STARTADR 0xFFFFFFF04 V6 u7 r$ o; r5 A( R) y7 Y" s" k# I
#define CPU1STARTMEM 0x2000000
7 }: k  B% H! e  e' Xvoid StartCpu1(void)
* O4 X  j1 a6 D7 w{
/ c' J4 q+ j. {" ^9 F9 ~, I8 x    #if 1
1 Y6 R6 l% Z! Q    fsbl_printf(DEBUG_GENERAL,"FSBL: Write the address of the application for CPU 1 to 0xFFFFFFF0\n\r");9 j" D9 q/ N* W/ g# i9 _
    Xil_Out32(CPU1STARTADR, CPU1STARTMEM);/ Z% ^& n$ L1 S9 n
    dmb(); //waits until write has finished' h' U) x: L8 s& t, L2 |, `; l" t- o
    fsbl_printf(DEBUG_GENERAL,"FSBL: Execute the SEV instruction to cause CPU 1 to wake up and jump to the application\n\r");
3 X  ~( H3 x7 W( O4 s    sev();
: R1 f- Y/ W7 d$ T7 C  G9 Z    #endif; T0 K% M' H" u$ s0 w
}# }) T  H! q6 ?5 Q* j
在load 镜像位置加入如图代码:StartCpu1();
6 P, l+ ]% q& \- A3 x8 x
! m* l# e0 T6 T% f3 U! v# Z8 Z
) \& P  j; S( I! {6 a将代码随意粘贴到主函数前面即可。然后在load 调用后打开CPU1即可。' a6 Y0 n! Y& H- W# D
* K& \# W) K& l8 X+ _; v# j# X5 F
接着直接生成即可。将BOOT.bin文件加载如sd卡,启动即可。- l* l" h. l; |: u

该用户从未签到

2#
发表于 2020-11-17 17:35 | 只看该作者
AMP架构双核应用程序开发和软中断处理
您需要登录后才可以回帖 登录 | 注册

本版积分规则

关闭

推荐内容上一条 /1 下一条

EDA365公众号

关于我们|手机版|EDA365电子论坛网 ( 粤ICP备18020198号-1 )

GMT+8, 2025-11-24 20:42 , Processed in 0.187500 second(s), 27 queries , Gzip On.

深圳市墨知创新科技有限公司

地址:深圳市南山区科技生态园2栋A座805 电话:19926409050

快速回复 返回顶部 返回列表