标准输入输出重定向问题。
我想问下大家在使用keil的RTE运行时里面重定向标准输入输出的问题。我在使用了文件系统函数名重映射和标准输入输出重映射后发现,我在用scanf等待接收数据的时候,再调用fread函数来去读文件的时候就block住了。我看了下代码,发现这两个函数再调用的时候最终都是调用了_sys_read()这个函数来真正的读取字符和读取文件。所以我猜测在调用scanf等待字符的时候block在当前,而没有退出_sys_read()这个函数。另一个线程再调用fread函数时也会最终调用_sys_read()函数。而中间这个过程会有互斥锁锁住导致fread会被block。这只是我的猜测,不知道有没有人搞过这个。用他们自带的这两个是否正常
eric2013 发表于 2018-9-16 00:04
用他们自带的这两个是否正常
对,我就是用它自带的那两个出的问题。 yswtxiao 发表于 2018-9-16 18:20
对,我就是用它自带的那两个出的问题。
好的,等我研究新版了试试。 eric2013 发表于 2018-9-17 00:25
好的,等我研究新版了试试。
这个我已经确认是RTX5在用标准输入输出重映射的一个小BUG了,就是这些函数是不可重入的。我已经发邮件跟keil那边的人沟通了。 rtx4里同样也有这个问题,具体就是那个rtx_lib.c最后面标准库使用的几个互斥量,那段代码是有问题的,同一个事件,例如你这里说的_sys_read(),每次都会要求一个新的互斥量,最后分配完了就死在那里了 这个问题我之前也研究过,不过没有给rtx报告啊,据我所知,中文网上最早发现这个问题还是rt thread的熊大 说起这个事情,我前几天也发现一个bug,暂时还没有报告给keil
rtx4的软件定时器有问题,唯一的kernal api竟然返回内部资源,即软件定时器的控制块,导致删除软件定时器api是非线程安全的,我自己使用都是用用户svc函数再封装的
myxiaonia 发表于 2018-9-17 10:09
rtx4里同样也有这个问题,具体就是那个rtx_lib.c最后面标准库使用的几个互斥量,那段代码是有问题的,同一 ...
RTX4的话,刚刚测试了下,是官方提供的这个重定向文件有问题,无法使用scanf,我输入1个参数,提示要64个。
所以我现在一直用的我们自己的comGetChar
myxiaonia 发表于 2018-9-17 10:09
rtx4里同样也有这个问题,具体就是那个rtx_lib.c最后面标准库使用的几个互斥量,那段代码是有问题的,同一 ...
恩,不过我再RTX5里的rtx_lib.c文件里面还没有找到你说的这个问题,你可不可以截图给我说明下。而且我的这个_sys_read()里面我看了下,没有涉及到互斥量的分配。不过我这样测试过:先用scanf()等待接收数据,然后用fread()读取文件,这时候fread被block住了,然后我通过上位机发字符串让scanf去接收,这时候scanf并没有返回。单独用scanf是可以返回的。 myxiaonia 发表于 2018-9-17 10:14
说起这个事情,我前几天也发现一个bug,暂时还没有报告给keil
rtx4的软件定时器有问题,唯一的kernal api ...
rtx的软件定时器我还没有用过,不是很了解咧。 eric2013 发表于 2018-9-17 11:17
RTX4的话,刚刚测试了下,是官方提供的这个重定向文件有问题,无法使用scanf,我输入1个参数,提示要64个 ...
恩,你的这个RTX4和我的rtx5的确有很大的区别。rtx5中返回值是len,这样上层就知道当前读取了多少个字符。 yswtxiao 发表于 2018-9-17 21:35
恩,你的这个RTX4和我的rtx5的确有很大的区别。rtx5中返回值是len,这样上层就知道当前读取了多少个字符 ...
回头也溜溜新版的文件系统。 eric2013 发表于 2018-9-17 11:17
RTX4的话,刚刚测试了下,是官方提供的这个重定向文件有问题,无法使用scanf,我输入1个参数,提示要64个 ...
scanf确实也有问题,我之前在amobbs那里还问过这个问题,感觉mdk的stdio就是个未完成品
yswtxiao 发表于 2018-9-17 21:29
恩,不过我再RTX5里的rtx_lib.c文件里面还没有找到你说的这个问题,你可不可以截图给我说明下。而且我的 ...
用stdio的话是会有互斥的问题,比较io这种流设备肯定是独占访问的,具体的话就是读操作会有读互斥,写会有写互斥
rtx4中标准库用到的互斥量,rtx的实现代码在此,但是有问题,我记得keil官方论坛有人讨论过这个问题
/*--------------------------- _mutex_initialize -----------------------------*/
int _mutex_initialize (OS_ID *mutex) {
/* Allocate and initialize a system mutex. */
if (nr_mutex >= OS_MUTEXCNT) {
/* If you are here, you need to increase the number OS_MUTEXCNT. */
for (;;);
}
*mutex = &std_libmutex;
mutex_init (*mutex);
return (1);
}
/*--------------------------- _mutex_acquire --------------------------------*/
__used void _mutex_acquire (OS_ID *mutex) {
/* Acquire a system mutex, lock stdlib resources. */
if (runtask_id ()) {
/* RTX running, acquire a mutex. */
mutex_wait (*mutex);
}
}
/*--------------------------- _mutex_release --------------------------------*/
__used void _mutex_release (OS_ID *mutex) {
/* Release a system mutex, unlock stdlib resources. */
if (runtask_id ()) {
/* RTX runnning, release a mutex. */
mutex_rel (*mutex);
}
}
myxiaonia 发表于 2018-9-19 21:33
用stdio的话是会有互斥的问题,比较io这种流设备肯定是独占访问的,具体的话就是读操作会有读互斥,写会 ...
恩,我对比了下,RTX4和RTX5在这里是不一样的,RTX5用函数重新封装了下,具体怎么获取互斥量就不清楚了,不过也是有问题的。 myxiaonia 发表于 2018-9-19 21:33
用stdio的话是会有互斥的问题,比较io这种流设备肯定是独占访问的,具体的话就是读操作会有读互斥,写会 ...
不过不清楚为什么RTX4有这样的问题,但是到了RTX5,怎么还没有解决。 yswtxiao 发表于 2018-9-19 22:35
不过不清楚为什么RTX4有这样的问题,但是到了RTX5,怎么还没有解决。
自己写个简单的scanf就好了,串口专用 myxiaonia 发表于 2018-9-19 21:33
用stdio的话是会有互斥的问题,比较io这种流设备肯定是独占访问的,具体的话就是读操作会有读互斥,写会 ...
FlahFS的API使用这个没问题的,多任务情况下加大heap大小可解决。
http://www.armbbs.cn/forum.php?mod=viewthread&tid=17477&highlight=FlashFS
eric2013 发表于 2018-9-22 09:43
FlahFS的API使用这个没问题的,多任务情况下加大heap大小可解决。
http://www.armbbs.cn/forum.php ...
嗯,RTX5我也确认了,修改启动文件里面的堆大小就解决了。
结贴了,问题已经找到了。 eric2013 发表于 2018-9-22 09:43
FlahFS的API使用这个没问题的,多任务情况下加大heap大小可解决。
http://www.armbbs.cn/forum.php ...
不过我还是奇怪,为什么用了文件系统之后就需要用这个堆,你在另一个帖子上说的互斥信号量的申请应该用的是RTX5内存池里面的空间呀,这个空间应该是调用标准C库函数malloc函数时从这里获取的吗? yswtxiao 发表于 2018-9-25 10:26
不过我还是奇怪,为什么用了文件系统之后就需要用这个堆,你在另一个帖子上说的互斥信号量的申请应该用的 ...
这个得搜下mdk的help文档,看看都那些C标准库函数(包括文件系统的API)需要在运行的实现使用堆空间。 本帖最后由 liankong123 于 2018-10-23 13:03 编辑
eric2013 发表于 2018-9-22 09:43
FlahFS的API使用这个没问题的,多任务情况下加大heap大小可解决。
http://www.armbbs.cn/forum.php ...
O(∩_∩)O谢谢分享,好人一生平安,问题已经解决 O(∩_∩)O谢谢分享,
页:
[1]