參考資訊:
https://zhuanlan.zhihu.com/p/597577575
https://blog.csdn.net/tttt234567890/article/details/7094636
https://studies.ac.upc.edu/doctorat/ENGRAP/VxWorks-device-drivers.htm
https://forums.windriver.com/t/vxworks-software-development-kit-sdk/43
https://mail.prz-rzeszow.pl/~ssamolej/vxworks/vxworks_kernel_programmers_guide_6.6.pdf
https://d13321s3lxgewa.cloudfront.net/downloads/wrsdk-vxworks7-docs/2309/README_qemu.html
https://learning.windriver.com/path/vxworks7-essentials-workbench-and-tools/vxworks-kernel-shell
https://www.ecb.torontomu.ca/~courses/ee8205/Data-Sheets/Tornado-VxWorks/vxworks/ref/selectLib.html#selWakeupListInit
main.c
#include <stdio.h> #include <stdlib.h> #include <string.h> #include <iosLib.h> #include <selectLib.h> static int drvNum = {0}; static DEV_HDR hdr = {0}; static SEL_WAKEUP_LIST selWakeupList = {0}; static void* myOpen(struct dev_hdr *dev, const char *remainder, int access, int mode) { if (remainder[0] != '\0') { return NULL; } printf("%s()\n", __func__); return dev; } static STATUS myClose(void *dev) { if (dev == NULL) { return ERROR; } printf("%s()\n", __func__); return OK; } static long myRead(void *dev, char *rbuf, size_t rbytes) { if (dev == NULL) { return 0; } printf("%s()\n", __func__); return 0; } static long myWrite(void *dev, const char *wbuf, size_t wbytes) { if (dev == NULL) { return 0; } printf("%s()\n", __func__); return 0; } static STATUS myIOCTL(void *dev, int cmd, long arg) { SEL_WAKEUP_NODE *node = (SEL_WAKEUP_NODE *)arg; if (dev == NULL) { return ERROR; } switch (cmd) { case FIOSELECT: if (selNodeAdd(&selWakeupList, node) == OK) { if (selWakeupType(node) == SELREAD) { printf("%s(), wakeup\n", __func__); selWakeupAll(&selWakeupList, SELREAD); } } break; case FIOUNSELECT: selNodeDelete(&selWakeupList, (SEL_WAKEUP_NODE *)arg); break; } return OK; } STATUS myProbe(void) { drvNum = iosDrvInstall(NULL, NULL, myOpen, myClose, myRead, myWrite, myIOCTL); iosDevAdd(&hdr, "/dev/hello", drvNum); selWakeupListInit(&selWakeupList); return OK; }
app.c
#include <errno.h> #include <stdio.h> #include <stddef.h> #include <stdlib.h> #include <unistd.h> #include <string.h> #include <sys/time.h> #include <sys/select.h> #include <fcntl.h> #define BUF_SIZE 255 #define DEV_NAME "/dev/hello" static char buf[BUF_SIZE] = {0}; int main(int argc, char **argv) { int fd = open(DEV_NAME, O_RDONLY); if (fd < 0) { printf("Failed tp open "DEV_NAME"\n"); return -1; } fd_set rfds; struct timeval tv; tv.tv_sec = 5; tv.tv_usec = 0; while (1) { FD_ZERO(&rfds); FD_SET(fd, &rfds); int ret = select(fd + 1, &rfds, NULL, NULL, &tv); if (ret == -1) { return -1; } else if (ret > 0) { read(fd, buf, BUF_SIZE); break; } } close(fd); return 0; }
編譯
$ wr-cc main.c -o hello -dkm $ wr-cc app.c -o app -dkm
執行
-> ld < hello -> myProbe -> devs drv refs name 22 [ 5] /dev/hello 13 [ 5] /dev/random 13 [ 5] /dev/urandom 12 [ 5] /dev/zero 11 [ 5] /fifos 16 [ 5] /host.host 14 [ 5] /input/event 0 [ 7] /null 5 [ 5] /ram 10 [ 5] /ram0 9 [ 5] /romfs 3 [ 5] /shm 10 [ 5] /tmp 2 [ 7] /ttyS0 value = 0 = 0x0 -> cmd [vxWorks *]# app myOpen() myIOCTL(), wakeup myRead() myClose() [vxWorks *]# C -> unld "hello"