Toggle navigation
首页
问答
文章
积分商城
专家
专区
更多专区...
文档中心
返回主站
搜索
提问
会员
中心
登录
注册
POSIX
RT-Thread POSIX支持
发布于 2016-05-08 12:19:34 浏览:4599
订阅该版
目前要比较完整的使用RT-Thread的POSIX特性需要打开: ``` #define RT_USING_LIBC #define RT_USING_DFS #define RT_USING_DFS_DEVFS #define RT_USING_DFS_LWIP #define RT_USING_PTHREADS #define RT_USING_LIBDL ``` [list] RT_USING_LIBC打开系统中的libc库(针对armcc/iar/gcc,分别对应armlibc, dlib, newlib三种不同的libc库);[/*:m] RT_USING_DFS/DFS_DEVFS/DFS_LWIP打开系统中的文件系统相关接口支持,分别是虚拟文件系统,设备文件系统,bsd socket可按照文件描述符方式操作;[/*:m] RT_USING_PTHREADS打开系统中的POSIX thread支持;[/*:m] RT_USING_LIBDL打开系统中的dlopen等动态库的符号特性;[/*:m][/list:u] 当前还缺少, 1. terminal相关接口的支持,即termios、tcgetattr/tcsetattr等接口;需要做当前console设备上进行封装; 2. pipe支持,需要进一步完善pipe驱动框架的支持,让它完全按照一个设备,并能够以文件描述符方式进行操作; 3. select操作,能够把设备文件,pipe文件等一起加入到fd_set中以支持select操作。 计划调整, DFS_LWIP更名为DFS_NET libdl,pthreads划归到libc文件夹下;
查看更多
4
个回答
默认排序
按发布时间排序
bernard
2016-05-10
这家伙很懒,什么也没写!
pthreads的实现位于: [https://github.com/RT-Thread/rt-thread/tree/master/components/pthreads](https://github.com/RT-Thread/rt-thread/ ... s/pthreads) 其中不仅包括了POSIX thread的实现,也包括了clock_time, mqueue, semaphore等的实现,即POSIX方式的多线程间同步和通信机制。当把pthreads和libc合并时,clock_time相关功能应该合并到其他libc实现中,而不是放在pthreads中。 BTW, lwIP出了2.0.0 beta1版本了,相关的移植,POSIX层面的封装也需要跟上
bernard
2016-05-22
这家伙很懒,什么也没写!
如果需要在lwip之外支持select接口(例如能够让fd_set支持到文件描述符,以及后续扩展的UNIX套接字),需要放弃lwip目前已有的select接口 lwIP的select实现类似于: 在创建一个socket时就默认设置一个事件callback函数,在一些事件触发时回调这个函数: ``` /** * Callback registered in the netconn layer for each socket-netconn. * Processes recvevent (data available) and wakes up tasks waiting for select. */ static void event_callback(struct netconn *conn, enum netconn_evt evt, u16_t len) { int s; struct lwip_sock *sock; struct lwip_select_cb *scb; int last_select_cb_ctr; SYS_ARCH_DECL_PROTECT(lev); LWIP_UNUSED_ARG(len); /* Get socket */ if (conn) { s = conn->socket; if (s < 0) { /* Data comes in right away after an accept, even though * the server task might not have created a new socket yet. * Just count down (or up) if that's the case and we * will use the data later. Note that only receive events * can happen before the new socket is set up. */ SYS_ARCH_PROTECT(lev); if (conn->socket < 0) { if (evt == NETCONN_EVT_RCVPLUS) { conn->socket--; } SYS_ARCH_UNPROTECT(lev); return; } s = conn->socket; SYS_ARCH_UNPROTECT(lev); } sock = get_socket(s); if (!sock) { return; } } else { return; } SYS_ARCH_PROTECT(lev); /* Set event as required */ switch (evt) { case NETCONN_EVT_RCVPLUS: sock->rcvevent++; break; case NETCONN_EVT_RCVMINUS: sock->rcvevent--; break; case NETCONN_EVT_SENDPLUS: sock->sendevent = 1; break; case NETCONN_EVT_SENDMINUS: sock->sendevent = 0; break; case NETCONN_EVT_ERROR: sock->errevent = 1; break; default: LWIP_ASSERT("unknown event", 0); break; } if (sock->select_waiting == 0) { /* noone is waiting for this socket, no need to check select_cb_list */ SYS_ARCH_UNPROTECT(lev); return; } /* Now decide if anyone is waiting for this socket */ /* NOTE: This code goes through the select_cb_list list multiple times ONLY IF a select was actually waiting. We go through the list the number of waiting select calls + 1. This list is expected to be small. */ /* At this point, SYS_ARCH is still protected! */ again: for (scb = select_cb_list; scb != NULL; scb = scb->next) { if (scb->sem_signalled == 0) { /* semaphore not signalled yet */ int do_signal = 0; /* Test this select call for our socket */ if (sock->rcvevent > 0) { if (scb->readset && FD_ISSET(s, scb->readset)) { do_signal = 1; } } if (sock->sendevent != 0) { if (!do_signal && scb->writeset && FD_ISSET(s, scb->writeset)) { do_signal = 1; } } if (sock->errevent != 0) { if (!do_signal && scb->exceptset && FD_ISSET(s, scb->exceptset)) { do_signal = 1; } } if (do_signal) { scb->sem_signalled = 1; /* Don't call SYS_ARCH_UNPROTECT() before signaling the semaphore, as this might lead to the select thread taking itself off the list, invalidagin the semaphore. */ sys_sem_signal(&scb->sem); } } /* unlock interrupts with each step */ last_select_cb_ctr = select_cb_ctr; SYS_ARCH_UNPROTECT(lev); /* this makes sure interrupt protection time is short */ SYS_ARCH_PROTECT(lev); if (last_select_cb_ctr != select_cb_ctr) { /* someone has changed select_cb_list, restart at the beginning */ goto again; } } SYS_ARCH_UNPROTECT(lev); } ``` 在这个其中,依据事件的类型来设置一些参数: ``` /* Set event as required */ switch (evt) { case NETCONN_EVT_RCVPLUS: sock->rcvevent++; break; case NETCONN_EVT_RCVMINUS: sock->rcvevent--; break; case NETCONN_EVT_SENDPLUS: sock->sendevent = 1; break; case NETCONN_EVT_SENDMINUS: sock->sendevent = 0; break; case NETCONN_EVT_ERROR: sock->errevent = 1; break; default: LWIP_ASSERT("unknown event", 0); break; } ``` 以及确实触发了事件,则发送一个信号量,这个在lwip中是以sys_sem_signal的方式进行: ``` if (do_signal) { scb->sem_signalled = 1; /* Don't call SYS_ARCH_UNPROTECT() before signaling the semaphore, as this might lead to the select thread taking itself off the list, invalidagin the semaphore. */ sys_sem_signal(&scb->sem); } ``` 因为lwIP为了减少移植接口,所以基本上只采取一些最基本的任务间同步的机制,这里如果使用event flag的方式会更好。 即,如果要在外部实现对lwIP的select操作,需要对socket设置不同的event callback回调函数,并根据类似的情况来设置socket中的rcvevent/sendevent值。
bernard
2016-05-22
这家伙很懒,什么也没写!
同理,如果要实现统一的基于fd的select接口: ``` int select(int nfds, fd_set *readfds, fd_set *writefds, fd_set *errorfds, struct timeval *timeout); ``` 可以为每个fd提供包括:read_event,write_event和error_event的参数。对于device来说,当接收到数据,会在rx_indicate和tx_complete中设置read_event和write_event。在一个任务做select时,如果fd都不满足条件时,则以select control block(select_cb)的方式挂起select_cb_list链表上。 当触发了event callback,它需要在select_cb_list链表上遍历每个select control block,如果有相应的fd,则尝试唤醒挂起的任务。
撰写答案
登录
注册新账号
关注者
0
被浏览
4.6k
关于作者
bernard
这家伙很懒,什么也没写!
提问
414
回答
5940
被采纳
76
关注TA
发私信
相关问题
1
移植rt-thread2.1.0缺少components/pthreads里的posix_types.h文件中包含的sy
2
[征集自愿者] POSIX相关章节文档编写
3
POSIX标准接口针对文件系统没有导出fsync
4
POSIX接口的select还没实现?
5
pthread 组建bug反馈
6
RTT中的POSIX支持
7
RT-Thread 如何用POSIX接口
8
使用 RT_USING_POSIX finsh能显示,但不能输入
9
请教、讨论POSIX接口、dfs中的pos和size问题
10
在使用RT_USING_POSIX时,finish 命令问题
推荐文章
1
RT-Thread应用项目汇总
2
玩转RT-Thread系列教程
3
国产MCU移植系列教程汇总,欢迎查看!
4
机器人操作系统 (ROS2) 和 RT-Thread 通信
5
五分钟玩转RT-Thread新社区
6
【技术三千问】之《玩转ART-Pi》,看这篇就够了!干货汇总
7
关于STM32H7开发板上使用SDIO接口驱动SD卡挂载文件系统的问题总结
8
STM32的“GPU”——DMA2D实例详解
9
RT-Thread隐藏的宝藏之completion
10
【ART-PI】RT-Thread 开启RTC 与 Alarm组件
最新文章
1
如何在master上的BSP中添加配置yml文件
2
使用百度AI助手辅助编写一个rt-thread下的ONVIF设备发现功能的功能代码
3
RT-Thread 发布 EtherKit开源以太网硬件!
4
rt-thread使用cherryusb实现虚拟串口
5
《C++20 图形界面程序:速度与渲染效率的双重优化秘籍》
热门标签
RT-Thread Studio
串口
Env
LWIP
SPI
AT
Bootloader
Hardfault
CAN总线
FinSH
ART-Pi
USB
DMA
文件系统
RT-Thread
SCons
RT-Thread Nano
线程
MQTT
STM32
RTC
FAL
rt-smart
ESP8266
I2C_IIC
WIZnet_W5500
UART
ota在线升级
PWM
cubemx
freemodbus
flash
packages_软件包
BSP
潘多拉开发板_Pandora
定时器
ADC
GD32
flashDB
socket
中断
Debug
编译报错
msh
SFUD
keil_MDK
rt_mq_消息队列_msg_queue
ulog
C++_cpp
at_device
本月问答贡献
踩姑娘的小蘑菇
7
个答案
3
次被采纳
a1012112796
13
个答案
2
次被采纳
张世争
9
个答案
2
次被采纳
rv666
5
个答案
2
次被采纳
用户名由3_15位
11
个答案
1
次被采纳
本月文章贡献
程序员阿伟
9
篇文章
2
次点赞
hhart
3
篇文章
4
次点赞
大龄码农
1
篇文章
5
次点赞
RTT_逍遥
1
篇文章
2
次点赞
ThinkCode
1
篇文章
1
次点赞
回到
顶部
发布
问题
分享
好友
手机
浏览
扫码手机浏览
投诉
建议
回到
底部