嘗試了很多裸跑下的功能測試,發現對於網口通信還是在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燈在閃爍,表明程序在運行,並打印信息如下所示