ZYNQ LINUX开发笔记——内存直接访问
生活随笔
收集整理的這篇文章主要介紹了
ZYNQ LINUX开发笔记——内存直接访问
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
提示:文章寫完后,目錄可以自動生成,如何生成可參考右邊的幫助文檔
ZYNQ LINUX開發筆記——內存直接訪問
- LINUX 腳本方式
- C APP模式
LINUX 腳本方式
寫內存: devmem 0xFFFF1001 32 0x00000001 讀內存: devmem 0xFFFF1001 32 0x00000001 如果在C模塊中需要調用LINUX腳本則: system("devmem 0xFFFF1001 32 0x1")C APP模式
/dev/mem是物理內存的全映像,可以用來訪問物理內存,一般用法是open(“/dev/mem”,O_RDWR|O_SYNC),然后mmap,接著就可以用mmap的地址來訪問物理內存,這實際上就是實現用戶空間驅動的一種方法。
關鍵代碼:#include <errno.h> #include <sys/mman.h>#define PAGE_SIZE ((size_t)getpagesize()) #define PAGE_MASK ((uint64_t)(long)~(PAGE_SIZE - 1)) #define COMM_BASE 0xFFFF9000int mmfd; volatile uint8_t *mm;/*******************共享內存建立映射關系******************/mmfd = open("/dev/mem", O_RDWR|O_SYNC);if (mmfd < 0) {fprintf(stderr, "open(/dev/mem) failed (%d)\n", errno);return 1;}mm = mmap(NULL, PAGE_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, mmfd, COMM_BASE);if (mm == MAP_FAILED) {fprintf(stderr, "mmap64(0x%x@0x%x) failed (%d)\n",PAGE_SIZE, (uint32_t)(COMM_BASE), errno);return 1;}printf("mapbase=%x\n",(unsigned int)mm); /******************************************************/flag = *(volatile uint32_t *)(mm + COMM_TX_FLAG_OFFSET));*(volatile uint32_t *)(mm + COMM_TX_FLAG_OFFSET) = 0; munmap((void *)mm, PAGE_SIZE); close(fd);總結
以上是生活随笔為你收集整理的ZYNQ LINUX开发笔记——内存直接访问的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: html5 签到墙,签名墙尺寸一般设置多
- 下一篇: CP2102简介