日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

在100ask stm32mp157板子上运行超级玛丽

發布時間:2023/12/29 编程问答 34 豆豆
生活随笔 收集整理的這篇文章主要介紹了 在100ask stm32mp157板子上运行超级玛丽 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

在100ask stm32mp157板子上運行超級瑪麗

一、下載arm-NES-linux

git clone https://gitee.com/ant1423/arm-NES-linux.git

二、修改源碼支持標準輸入控制

這一步主要修改源碼根目錄下的linux/joypad_input.cpp文件,要生成linux可用的程序,只需要在linux目錄下面執行make命令即可,但是由于編譯的是cpp文件,所以需要交叉編譯工具鏈支持c++,文末直接給出代碼

添加了一個新的函數以支持從標準輸入獲取輸入事件,這里的映射關系是參考的上面手柄來設置的

設置一個T_JoypadInput結構體

最后在InitJoypadInput函數里注冊就行了

三、 編譯運行

編譯只需要在arm-NES-linux/linux目錄下執行make命令就行了,編譯生成InfoNes文件,把它和游戲ROM拷貝到板子上,添加執行權限就可以運行
注意,如果myir的QT程序正在運行,需要關閉myir的QT程序

systemctp stop myir

關閉成功后即可執行InfoNes,如運行超級瑪麗

./InfoNES Super_Mario.nes


效果如下圖所示

按在串口輸入H開始游戲,J是跳躍,K是攻擊,AD是移動

四、問題

1、顏色顯示的不正確,這里可能需要修改RGB格式
1、在按下按鍵的時候,延時設置的是500毫秒,在按鍵按下之后也沒有上報松開事件,整體的體驗不是很好
2、在通過第一關的時候,內核會報錯,這里沒有仔細調。無法進入下一關,并且無法重新啟動游戲

joypad_input.cpp

#include <stdio.h> #include <sys/types.h> #include <sys/stat.h> #include <fcntl.h> #include <unistd.h> #include <pthread.h> #include <sys/ioctl.h> #include <termios.h> #include<sys/select.h> #include <sys/time.h> #include <errno.h> #include <string.h>#define JOYPAD_DEV "/dev/joypad" #define USB_JS_DEV "/dev/input/js0"typedef struct JoypadInput{int (*DevInit)(void);int (*DevExit)(void);int (*GetJoypad)(void);struct JoypadInput *ptNext;pthread_t tTreadID; /* 子線程ID */ }T_JoypadInput, *PT_JoypadInput;struct js_event { unsigned int time; /* event timestamp in milliseconds */ unsigned short value; /* value */ unsigned char type; /* event type */ unsigned char number; /* axis/button number */ };//全局變量通過互斥體訪問 static unsigned char g_InputEvent;static pthread_mutex_t g_tMutex = PTHREAD_MUTEX_INITIALIZER; static pthread_cond_t g_tConVar = PTHREAD_COND_INITIALIZER;static int joypad_fd; static int USBjoypad_fd;static PT_JoypadInput g_ptJoypadInputHead;struct termios g_tStoredSettings; struct termios g_tNewSettings;static void *InputEventTreadFunction(void *pVoid) {/* 定義函數指針 */int (*GetJoypad)(void);GetJoypad = (int (*)(void))pVoid;while (1){//因為有阻塞所以沒有輸入時是休眠g_InputEvent = GetJoypad();//有數據時喚醒pthread_mutex_lock(&g_tMutex);/* 喚醒主線程 */pthread_cond_signal(&g_tConVar);pthread_mutex_unlock(&g_tMutex);} }static int RegisterJoypadInput(PT_JoypadInput ptJoypadInput) {PT_JoypadInput tmp;if(ptJoypadInput->DevInit()){return -1;}//初始化成功創建子線程 將子項的GetInputEvent 傳進來pthread_create(&ptJoypadInput->tTreadID, NULL, InputEventTreadFunction, (void*)ptJoypadInput->GetJoypad);if(! g_ptJoypadInputHead){g_ptJoypadInputHead = ptJoypadInput;}else{tmp = g_ptJoypadInputHead;while(tmp->ptNext){tmp = tmp->ptNext;}tmp->ptNext = ptJoypadInput;}ptJoypadInput->ptNext = NULL;return 0; }static int joypadGet(void) {return read(joypad_fd, 0, 0); }static int joypadDevInit(void) {joypad_fd = open(JOYPAD_DEV, O_RDONLY);if(-1 == joypad_fd){printf("%s dev not found \r\n", JOYPAD_DEV);return -1;}return 0; }static int joypadDevExit(void) {close(joypad_fd);return 0; }static T_JoypadInput joypadInput = {joypadDevInit,joypadDevExit,joypadGet, };static int USBjoypadGet(void) {/*** FC手柄 bit 鍵位對應關系 真實手柄中有一個定時器,處理 連A 連B * 0 1 2 3 4 5 6 7* A B Select Start Up Down Left Right*///因為 USB 手柄每次只能讀到一位鍵值 所以要有靜態變量保存上一次的值static unsigned char joypad = 0;struct js_event e;if(0 < read (USBjoypad_fd, &e, sizeof(e))){if(0x2 == e.type){/*上:value:0x8001 type:0x2 number:0x5value:0x0 type:0x2 number:0x5*/if(0x8001 == e.value && 0x5 == e.number){joypad |= 1<<4;}/*下:value:0x7fff type:0x2 number:0x5value:0x0 type:0x2 number:0x5*/if(0x7fff == e.value && 0x5 == e.number){joypad |= 1<<5;}//松開if(0x0 == e.value && 0x5 == e.number){joypad &= ~(1<<4 | 1<<5);}/*左:value:0x8001 type:0x2 number:0x4value:0x0 type:0x2 number:0x4*/if(0x8001 == e.value && 0x4 == e.number){joypad |= 1<<6;}/*右:value:0x7fff type:0x2 number:0x4value:0x0 type:0x2 number:0x4*/if(0x7fff == e.value && 0x4 == e.number){joypad |= 1<<7;}//松開if(0x0 == e.value && 0x4 == e.number){joypad &= ~(1<<6 | 1<<7);}}if(0x1 == e.type){/*選擇:value:0x1 type:0x1 number:0xavalue:0x0 type:0x1 number:0xa*/if(0x1 == e.value && 0xa == e.number){joypad |= 1<<2;}if(0x0 == e.value && 0xa == e.number){joypad &= ~(1<<2);}/*開始:value:0x1 type:0x1 number:0xbvalue:0x0 type:0x1 number:0xb*/if(0x1 == e.value && 0xb == e.number){joypad |= 1<<3;}if(0x0 == e.value && 0xb == e.number){joypad &= ~(1<<3);}/*Avalue:0x1 type:0x1 number:0x0value:0x0 type:0x1 number:0x0*/if(0x1 == e.value && 0x0 == e.number){joypad |= 1<<0;}if(0x0 == e.value && 0x0 == e.number){joypad &= ~(1<<0);}/*Bvalue:0x1 type:0x1 number:0x1value:0x0 type:0x1 number:0x1*/if(0x1 == e.value && 0x1 == e.number){joypad |= 1<<1;}if(0x0 == e.value && 0x1 == e.number){joypad &= ~(1<<1);}/*Xvalue:0x1 type:0x1 number:0x3value:0x0 type:0x1 number:0x3*/if(0x1 == e.value && 0x3 == e.number){joypad |= 1<<0;}if(0x0 == e.value && 0x3 == e.number){joypad &= ~(1<<0);}/*Yvalue:0x1 type:0x1 number:0x4value:0x0 type:0x1 number:0x4*/if(0x1 == e.value && 0x4 == e.number){joypad |= 1<<1;}if(0x0 == e.value && 0x4 == e.number){joypad &= ~(1<<1);}}return joypad;}return -1; }static int USBjoypadDevInit(void) {USBjoypad_fd = open(USB_JS_DEV, O_RDONLY);if(-1 == USBjoypad_fd){printf("%s dev not found \r\n", USB_JS_DEV);return -1;}return 0; }static int USBjoypadDevExit(void) {close(USBjoypad_fd);return 0; }static T_JoypadInput usbJoypadInput = {USBjoypadDevInit,USBjoypadDevExit,USBjoypadGet, };/* 從標準輸入獲取輸入 */ static int CmdJoypadGet(void) {/*** FC手柄 bit 鍵位對應關系 真實手柄中有一個定時器,處理 連A 連B * 0 1 2 3 4 5 6 7* A B Select Start Up Down Left Right*///因為 USB 手柄每次只能讀到一位鍵值 所以要有靜態變量保存上一次的值/* A --> LeftS --> DownW --> UpD --> RightG --> SelectH --> StartJ --> AK --> B*/unsigned char joypad = 0;static unsigned char LastJoypad = 0;char c = 0;static char LastC = 0;int ret = 0;fd_set read_fds;FD_ZERO(&read_fds);FD_SET(STDIN_FILENO, &read_fds);struct timeval tTimeOut;tTimeOut.tv_usec = 500000; //500msret = select(1, &read_fds, NULL, NULL, &tTimeOut);if(ret <= 0){printf("select timeout or error, ret = %d, errno:%d -> %s\r\n", ret, errno, strerror(errno));return 0;}if(FD_ISSET(0, &read_fds)){read(0, &c, 1);}else{printf("error ! invaild fd\n");return 0;}printf("Get Input From Cmd: %c\r\n", c);switch (c){case 'A':case 'a':/* Left */joypad |= 1<<6;break;case 'S':case 's':/* Down */joypad |= 1<<5;break;case 'D':case 'd':/* Right */joypad |= 1<<7;break;case 'W':case 'w':/* Up */joypad |= 1<<4;break;case 'J':case 'j':/* A */joypad |= 1<<0;break;case 'K':case 'k':/* B */joypad |= 1<<1;case 'G':case 'g':/* Select */joypad |= 1<<2;break;case 'H':case 'h':/* Start */joypad |= 1<<3;break; default:break;}printf("Get Input Data Return %u\r\n", joypad);LastJoypad = joypad;LastC = c;return joypad; }static int CmdJoypadDevInit(void) {tcgetattr (0, &g_tStoredSettings);g_tNewSettings = g_tStoredSettings;g_tNewSettings.c_lflag &= (~ICANON);g_tNewSettings.c_cc[VTIME] = 0;g_tNewSettings.c_cc[VMIN] = 1;tcsetattr (0, TCSANOW, &g_tNewSettings);return 0; }static int CmdJoypadDevExit(void) {tcsetattr (0, TCSANOW, &g_tStoredSettings); // 恢復終端參數return 0; }static T_JoypadInput CmdJoypadInput = {CmdJoypadDevInit,CmdJoypadDevExit,CmdJoypadGet, };int InitJoypadInput(void) {int iErr = 0; // iErr = RegisterJoypadInput(&joypadInput); // iErr = RegisterJoypadInput(&usbJoypadInput);iErr = RegisterJoypadInput(&CmdJoypadInput);return iErr; }int GetJoypadInput(void) {printf("get input sleep...\r\n");/* 休眠 */pthread_mutex_lock(&g_tMutex);pthread_cond_wait(&g_tConVar, &g_tMutex); printf("wake up get data...\r\n");/* 被喚醒后,返回數據 */pthread_mutex_unlock(&g_tMutex);return g_InputEvent; }

總結

以上是生活随笔為你收集整理的在100ask stm32mp157板子上运行超级玛丽的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。

主站蜘蛛池模板: 电车痴汉在线观看 | 黄色免费在线播放 | 三级精品在线观看 | 国产精品欧美久久久久天天影视 | 中国久久久 | 超薄肉色丝袜一区二区 | 一区二区有码 | 亚洲国产成人精品一区二区三区 | 日韩三级在线免费观看 | 夜夜夜综合 | 亚洲码国产精品高潮在线 | 神马电影久久 | 香蕉视频网页版 | 免费成人深夜夜视频 | 你懂的欧美 | 狠狠干导航 | 日韩视频在线观看一区二区三区 | 麻豆视频软件 | 国产极品一区 | 国模少妇一区二区 | 国产精品自拍小视频 | 九九综合久久 | 国产一区二区视频免费在线观看 | 182av| www亚洲视频| 好吊操av| 噼里啪啦国语高清 | 国产女主播av | 97精品国产97久久久久久春色 | 国产成人亚洲一区二区 | 中文字幕少妇 | 国产精品99无码一区二区视频 | 精品视频免费观看 | 怡红院最新网址 | 欧美有码在线观看 | 最新在线中文字幕 | 尤物视频在线观看视频 | 在线 日本 制服 中文 欧美 | 日本视频在线观看 | 国产精品电影一区二区 | 亚洲第一在线视频 | 日本一区免费看 | 久久成人在线观看 | 人妻内射一区二区在线视频 | 精品国产乱码久久久久久闺蜜 | 在线观看一级片 | 天天躁夜夜躁狠狠躁 | 91精品婷婷国产综合久久蝌蚪 | 老司机黄色片 | 丝袜熟女一区二区 | 国产永久在线 | 人人妻人人玩人人澡人人爽 | 在线不卡中文字幕 | 天堂网av中文字幕 | 日本不卡一二 | 在线观看成人小视频 | 午夜啪啪福利视频 | 一区二区国产电影 | av免费网站在线观看 | 亚洲老女人av | 性生交大片免费看l | 日本在线一区二区 | 一色道久久88加勒比一 | av色先锋 | 免费人成网站 | 亚洲综合免费视频 | 亚洲熟女综合色一区二区三区 | 一区二区伦理片 | 亚洲成人乱码 | 欧美成人三级在线播放 | 日本欧美国产在线 | 成人精品区 | 久久青青草原亚洲av无码麻豆 | 成人天堂噜噜噜 | av中文字幕免费在线观看 | 日韩在线精品视频 | 欧美亚洲一区二区在线观看 | 99有精品| 天海翼一区| 91禁在线观看 | 成人3d动漫一区二区三区91 | 黄色网页免费 | www.日韩在线观看 | 日韩乱码一区二区 | 一区二区三区日韩视频 | 麻豆影视大全 | 娇小萝被两个黑人用半米长 | 亚洲精品乱码久久久久久久久久久久 | 制服.丝袜.亚洲.中文.综合 | 亚洲美免无码中文字幕在线 | 久久视频在线观看免费 | 黄色视屏在线看 | 国产黄色在线看 | 欧美综合成人 | 国产美女又黄又爽又色视频免费 | 国产福利在线视频 | 亚洲 另类 春色 国产 | 免费啪啪小视频 | 欧美日韩三级视频 |