查看: 2627|回复: 0

领航者ZYNQ开发板试用6:Cortex-A9双核通信实验

[复制链接]
  • TA的每日心情
    开心
    2022-8-6 16:18
  • 签到天数: 72 天

    连续签到: 1 天

    [LV.6]常住居民II

    发表于 2020-2-28 20:10:18 | 显示全部楼层 |阅读模式
    分享到:

    领航者ZYNQ开发板的核心板使用的XC7Z010芯片包含两个ARM Cortex-A9处理器,这两个处理器是一种非对称多核处理器(asymmetricalmulti-core processors,AMP)的关系,CPU0是主处理器,控制系统运行和资源分配,CPU1是从处理器,执行主CPU 的命令或者预定义的任务,两个处理器有共同的存储器和外设,可以同时运行自己的操作系统或者裸机应用程序。下面实验拟把两个ARM运行起来,并通过共享内容进行双核之间的通信,共同控制一个串口外设打印输出结果,具体步骤如下:

    1、我们在hell_world工程基础上修改,先解压【正点原子】领航者 ZYNQ开发板光盘资料\领航者ZYNQ开发板资料盘(A盘)\4_SourceCode\ZYNQ_7010\2_Embedded_System.rar压缩包内的hell_world工程到工作区,如:D:\workspace

    2、删除工程目录下的hello_world.sdk目录,后面我们重新写测试程序,不再需要原来工程的程序。
    3、用vavido2018.3打开工程,然后配置ZYNQ IP增加SD卡外设,我们需要先把双核程序固化到SD卡,上电后自行启动两个CPU的程序,配置界面如下图示:
    601.jpg
    另外还需要点左侧MIO Configuration把Bank1 I/O Voltage从LVCMOS 3.3V修改为LVCMOS 1.8V后点OK结束配置,然后在Source窗口中右键点击 Block Design设计文件system.bd 执行Create HDL Wrapper...和Generate Output Products, 完成后在菜单栏中选择File->Export-> Export hardware重新导出硬件,在弹出的对话框中不需要勾选Includebitstream。
    4、在菜单栏中选择File-> Launch SDK打开SDK软件,在SDK软件菜单栏中选择File-> New-> ApplicationProject, 在弹出的New Project对话框Projectname填FSBL,其它为默认值,按Next后选择模板(Templates)为Zynq FSBL后按Finish生成FSBL工程和FSBL_bsp包。
    5、和第4步类似,新建一个名为app0的应用工程,Board Support Package选择Use existing FSBL_bsp,按Next后选择模板(Templates)为hellowold后按Finish完成工程;打开app0/src/lscript.ld文件,把ps7_ddr_0的Size修改为0x1FF00000后保存,如下图示:
    602.jpg


    打开app0/src/helloworld.c文件,把其代码修改为:
    #include<stdio.h>
    #include"platform.h"
    #include"xil_printf.h"
    #include"sleep.h"
    #include"xil_io.h"


    #define CPU1_START_UP_REG 0xFFFFFFF0
    #define CPU1STARTADR      0x20000000
    #define COMM_VAL (* (volatileunsignedshort*)(0xFFFF0000))


    intmain()
    {
        unsignedshorti;
        init_platform();

        print("Zynq dual core communication test\n\r");


        Xil_SetTlbAttributes(0xFFFF0000,0x14de2);  
       COMM_VAL = 0;
       Xil_Out32(CPU1_START_UP_REG,CPU1STARTADR);
        dmb();//waits until write has finished
        print("CPU0:sending the SEV to wake up CPU1\n\r");
        __asm__("sev");
       dmb();


       srand(1);
       while(1){
         i = rand()%256;
         xil_printf("CPU0 write data: %d\n\r",i);
         COMM_VAL = 0x8000 + i;
         sleep(5); //delay 5s
         while(COMM_VAL!=0);
       }


    cleanup_platform();
    return 0;
    }


    最后按ctrl + s保存后自动进行编译。
    6、同上一步新建一个名为app1的应用工程,Processor选择ps7_cortexa9_1,Board Support Package选择Create New app1_bsp,如下图示:
    603.jpg


    按Next后选择模板(Templates)为hellowold后按Finish完成工程;打开app1/src/lscript.ld文件,把ps7_ddr_0的Base Address修改为0x20000000, Size修改为0xFF00000后保存,再打开app1/src/helloworld.c文件,把其代码修改为:


    #include<stdio.h>
    #include"platform.h"
    #include"xil_printf.h"
    #include"sleep.h"
    #include"xil_io.h"


    #define COMM_VAL (* (volatileunsignedshort*)(0xFFFF0000))


    intmain()
    {
        unsignedshorti;
        init_platform();


        Xil_SetTlbAttributes(0xFFFF0000,0x14de2);
        while(1){
            while(COMM_VAL==0);
            i = COMM_VAL & 0xff;
            xil_printf("CPU1 get data:   %d\n\r", i);
           COMM_VAL = 0;
           sleep(5); //delay 5s
       }


    cleanup_platform();
    return 0;
    }
    7、双击打开app1_bsp/system.mss文件,点击Modify this BSP‘s Settings, 在弹出对话框中将drivers下的ps7_cortexa9_1中-g后添加-DUSE_AMP=1,如下图示:
    604.jpg


    点OK后自动进行编译。
    8、至此两个CPU的程序工程已经编译OK, 点击选择SDK软件左侧的FSBL工程,然后在SDK软件菜单栏中选择Xilinx->Create Boot Image, 在弹出对话框中默认bootloader已经加入,点右侧的Add增加CPU0和CPU1的程序后按Create Image,如下图示:
    605.jpg
    9、把生成的1_hello_world\hello_world.sdk\FSBL\bootimage目录下BOOT.bin文件拷贝到一个SD卡(根目录)上,然后把开发板的启动模式开关BOOT_CFG的两个开关均拨到OFF位置,设置为从SD卡启动,插好SD卡和串口线后给开发板上电可以看到CPU0生成一个随机数写到共享内容,然后CPU1从共享内容读出这个数,从打印结果看到读写的数值完全一致,具体操作和测试结果如下视频所示:






    回复

    使用道具 举报

    您需要登录后才可以回帖 注册/登录

    本版积分规则

    关闭

    站长推荐上一条 /2 下一条



    手机版|小黑屋|与非网

    GMT+8, 2024-12-28 02:34 , Processed in 0.131926 second(s), 16 queries , MemCache On.

    ICP经营许可证 苏B2-20140176  苏ICP备14012660号-2   苏州灵动帧格网络科技有限公司 版权所有.

    苏公网安备 32059002001037号

    Powered by Discuz! X3.4

    Copyright © 2001-2024, Tencent Cloud.