## b_mod_select ### 数据结构 ```C typedef struct { uint8_t fds[(SELECT_FDS_NUMBER + 7) / 8]; } bFdSet_t; ``` ### 接口介绍 ```C #define bFD_ZERO(pfds) \ do \ { \ if ((pfds) != NULL) \ { \ memset((pfds), 0, sizeof(bFdSet_t)); \ } \ } while (0) #define bFD_SET(fd, pfds) \ do \ { \ if ((fd) < SELECT_FDS_NUMBER && (pfds) != NULL) \ { \ (pfds)->fds[(fd) / 8] |= 0x1 << ((fd) % 8); \ } \ } while (0) #define bFD_ISSET(fd, pfds) ((pfds)->fds[(fd) / 8] & (0x1 << ((fd) % 8))) #define B_PT_SELECT(pt, maxfdp, readfds, writefds, errorfds, timeout, result) \ PT_WAIT_UNTIL(pt, (result = bSelect(maxfdp, readfds, writefds, errorfds)) > 0, timeout) // bSelect是非阻塞的,如果要做到阻塞的效果,建议开启pt,并使用B_PT_SELECT int bSelect(int maxfdp, bFdSet_t *readfds, bFdSet_t *writefds, bFdSet_t *errorfds); ``` ### 使用例子 ```C static PT_THREAD(gsensor_task(struct pt *pt)) { int count = 0; bGsensor3Axis_t Gsensor[32]; static int fd = -1; static bFdSet_t fdset; PT_BEGIN(pt); fd = bOpen(bLIS3DH, BCORE_FLAG_RW); if (fd < 0) { return 0; } while (1) { bFD_ZERO(&fdset); bFD_SET(fd, &fdset); B_PT_SELECT(pt, fd + 1, &fdset, NULL, NULL, 2000, count); b_log("select:%d\r\n", count); if (count > 0) { if (bFD_ISSET(fd, &fdset)) { bRead(fd, (uint8_t *)&Gsensor, sizeof(Gsensor)); for (int i = 0; i < 32; i++) { b_log("x:%d y:%d z:%d\r\n", Gsensor[i].x_mg, Gsensor[i].y_mg, Gsensor[i].z_mg); } } } } PT_END(pt); } ```