PYNQ2中第一個linux程序

嘗試了很多裸跑下的功能測試,發現對於網口通信還是在linux系統下,流程控制更加方便,於是有了linux第一個應用程序:點亮LED.
1、硬件設置
新建工程,添加gpio如下所示:
在這裏插入圖片描述
找到分配的物理地址,如下所示:
在這裏插入圖片描述
添加管教約束xdc
set_property IOSTANDARD LVCMOS33 [get_ports {GPIO_tri_o[0]}]
set_property IOSTANDARD LVCMOS33 [get_ports {GPIO_tri_o[1]}]
set_property IOSTANDARD LVCMOS33 [get_ports {gpio_rtl_tri_o[0]}]
set_property IOSTANDARD LVCMOS33 [get_ports {gpio_rtl_tri_o[1]}]

set_property PACKAGE_PIN R14 [get_ports {GPIO_tri_o[0]}]
set_property PACKAGE_PIN P14 [get_ports {GPIO_tri_o[1]}]
set_property PACKAGE_PIN N16 [get_ports {gpio_rtl_tri_o[0]}]
set_property PACKAGE_PIN M14 [get_ports {gpio_rtl_tri_o[1]}]
生成bit文件。
2、cpp文件編寫
一般的教程是在設備樹裏找到相關GPIO的設備號,然後對其進行讀寫。而我這裏的思路是,在linux下對GPIO的物理基地址進行映射,獲得操作系統可以操作的虛擬地址。這樣在後面的數據處理中都可以只需要對地址操作就行。
源碼如下所示:

#include "stdlib.h"
#include "stdio.h"
#include "string.h"
#include "unistd.h"

#include <fcntl.h>
#include <ctype.h>
#include <sys/mman.h>
#include <math.h>

int fd1 = 0;          //虛擬地址的句柄
int *baseaddr = NULL; //數據命令空間對應的虛擬地址。eaddr
int MAP_SIZE = 64 * 4;
int DEBUG_REG_ADDR = 0x41200000; //物理空間地址。

int main(int argc, char *argv[])
{
    int i;
    int offset = 0; //0x80;
	
    fd1 = open("/dev/mem", O_RDWR | O_CREAT, S_IRUSR | S_IWUSR);
    if (fd1 < 0)
    {
        printf("err open \r\n");
        return 0;
    }
	
    baseaddr = (int *)mmap(NULL, MAP_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd1, DEBUG_REG_ADDR);
    if (baseaddr == MAP_FAILED)
    {
	   printf(" mmap err\r\n");
        return 0;
    }
    while (1)
    {
		baseaddr[0] = 0xf;
		usleep(1000000);
		printf("0 open \r\n");
        
		baseaddr[0] = 0x0;
		usleep(1000000);
		printf("1 open \r\n");
    }
}

3、生成執行文件
要在線調試需要基於GDB,配置複雜,目前還沒有實現,所以這裏使用shell完成編譯。
首先將本地計算機和P2開發板通過網線連接,設置本地IP和192.168.2.99處於同一網段。
在計算機中輸入\192.168.2.99\xilinx 進入板卡中共享文件夾,新建文件夾led,然後將cpp文件複製到路徑下.
通過putty進入系統,如下所示:
在這裏插入圖片描述
通過su,進入root權限,密碼爲xilinx.
cd led文件夾輸入:
gcc test1.cpp –o test1
4、運行
下載bit文件,然後運行test1,led燈在閃爍,表明程序在運行,並打印信息如下所示
在這裏插入圖片描述

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章