硬汉嵌入式论坛

 找回密码
 立即注册
查看: 2386|回复: 23
收起左侧

[RL-RTX] 标准输入输出重定向问题。

  [复制链接]

4

主题

37

回帖

49

积分

初级会员

积分
49
发表于 2018-9-15 23:29:49 | 显示全部楼层 |阅读模式
我想问下大家在使用keil的RTE运行时里面重定向标准输入输出的问题。我在使用了文件系统函数名重映射和标准输入输出重映射后发现,我在用scanf等待接收数据的时候,再调用fread函数来去读文件的时候就block住了。我看了下代码,发现这两个函数再调用的时候最终都是调用了_sys_read()这个函数来真正的读取字符和读取文件。所以我猜测在调用scanf等待字符的时候block在当前,而没有退出_sys_read()这个函数。另一个线程再调用fread函数时也会最终调用_sys_read()函数。而中间这个过程会有互斥锁锁住导致fread会被block。这只是我的猜测,不知道有没有人搞过这个。
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
106685
QQ
发表于 2018-9-16 00:04:25 | 显示全部楼层
用他们自带的这两个是否正常
QQ截图20180916000411.png
回复

使用道具 举报

4

主题

37

回帖

49

积分

初级会员

积分
49
 楼主| 发表于 2018-9-16 18:20:43 | 显示全部楼层
eric2013 发表于 2018-9-16 00:04
用他们自带的这两个是否正常

对,我就是用它自带的那两个出的问题。
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
106685
QQ
发表于 2018-9-17 00:25:21 | 显示全部楼层
yswtxiao 发表于 2018-9-16 18:20
对,我就是用它自带的那两个出的问题。

好的,等我研究新版了试试。
回复

使用道具 举报

4

主题

37

回帖

49

积分

初级会员

积分
49
 楼主| 发表于 2018-9-17 09:30:10 | 显示全部楼层
eric2013 发表于 2018-9-17 00:25
好的,等我研究新版了试试。

这个我已经确认是RTX5在用标准输入输出重映射的一个小BUG了,就是这些函数是不可重入的。我已经发邮件跟keil那边的人沟通了。
回复

使用道具 举报

5

主题

578

回帖

593

积分

版主

Rank: 7Rank: 7Rank: 7

积分
593
发表于 2018-9-17 10:09:55 | 显示全部楼层
rtx4里同样也有这个问题,具体就是那个rtx_lib.c最后面标准库使用的几个互斥量,那段代码是有问题的,同一个事件,例如你这里说的_sys_read(),每次都会要求一个新的互斥量,最后分配完了就死在那里了
回复

使用道具 举报

5

主题

578

回帖

593

积分

版主

Rank: 7Rank: 7Rank: 7

积分
593
发表于 2018-9-17 10:10:56 | 显示全部楼层
这个问题我之前也研究过,不过没有给rtx报告啊,据我所知,中文网上最早发现这个问题还是rt thread的熊大
回复

使用道具 举报

5

主题

578

回帖

593

积分

版主

Rank: 7Rank: 7Rank: 7

积分
593
发表于 2018-9-17 10:14:28 | 显示全部楼层
说起这个事情,我前几天也发现一个bug,暂时还没有报告给keil
rtx4的软件定时器有问题,唯一的kernal api竟然返回内部资源,即软件定时器的控制块,导致删除软件定时器api是非线程安全的,我自己使用都是用用户svc函数再封装的
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
106685
QQ
发表于 2018-9-17 11:17:09 | 显示全部楼层
myxiaonia 发表于 2018-9-17 10:09
rtx4里同样也有这个问题,具体就是那个rtx_lib.c最后面标准库使用的几个互斥量,那段代码是有问题的,同一 ...

RTX4的话,刚刚测试了下,是官方提供的这个重定向文件有问题,无法使用scanf,我输入1个参数,提示要64个。

所以我现在一直用的我们自己的comGetChar

8888.png
回复

使用道具 举报

4

主题

37

回帖

49

积分

初级会员

积分
49
 楼主| 发表于 2018-9-17 21:29:18 | 显示全部楼层
myxiaonia 发表于 2018-9-17 10:09
rtx4里同样也有这个问题,具体就是那个rtx_lib.c最后面标准库使用的几个互斥量,那段代码是有问题的,同一 ...

恩,不过我再RTX5里的rtx_lib.c文件里面还没有找到你说的这个问题,你可不可以截图给我说明下。而且我的这个_sys_read()里面我看了下,没有涉及到互斥量的分配。不过我这样测试过:先用scanf()等待接收数据,然后用fread()读取文件,这时候fread被block住了,然后我通过上位机发字符串让scanf去接收,这时候scanf并没有返回。单独用scanf是可以返回的。
回复

使用道具 举报

4

主题

37

回帖

49

积分

初级会员

积分
49
 楼主| 发表于 2018-9-17 21:29:44 | 显示全部楼层
myxiaonia 发表于 2018-9-17 10:14
说起这个事情,我前几天也发现一个bug,暂时还没有报告给keil
rtx4的软件定时器有问题,唯一的kernal api ...

rtx的软件定时器我还没有用过,不是很了解咧。
回复

使用道具 举报

4

主题

37

回帖

49

积分

初级会员

积分
49
 楼主| 发表于 2018-9-17 21:35:58 | 显示全部楼层
eric2013 发表于 2018-9-17 11:17
RTX4的话,刚刚测试了下,是官方提供的这个重定向文件有问题,无法使用scanf,我输入1个参数,提示要64个 ...

恩,你的这个RTX4和我的rtx5的确有很大的区别。rtx5中返回值是len,这样上层就知道当前读取了多少个字符。
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
106685
QQ
发表于 2018-9-18 01:54:07 | 显示全部楼层
yswtxiao 发表于 2018-9-17 21:35
恩,你的这个RTX4和我的rtx5的确有很大的区别。rtx5中返回值是len,这样上层就知道当前读取了多少个字符 ...

回头也溜溜新版的文件系统。
回复

使用道具 举报

5

主题

578

回帖

593

积分

版主

Rank: 7Rank: 7Rank: 7

积分
593
发表于 2018-9-19 21:30:05 | 显示全部楼层
eric2013 发表于 2018-9-17 11:17
RTX4的话,刚刚测试了下,是官方提供的这个重定向文件有问题,无法使用scanf,我输入1个参数,提示要64个 ...

scanf确实也有问题,我之前在amobbs那里还问过这个问题,感觉mdk的stdio就是个未完成品
回复

使用道具 举报

5

主题

578

回帖

593

积分

版主

Rank: 7Rank: 7Rank: 7

积分
593
发表于 2018-9-19 21:33:48 | 显示全部楼层
yswtxiao 发表于 2018-9-17 21:29
恩,不过我再RTX5里的rtx_lib.c文件里面还没有找到你说的这个问题,你可不可以截图给我说明下。而且我的 ...

用stdio的话是会有互斥的问题,比较io这种流设备肯定是独占访问的,具体的话就是读操作会有读互斥,写会有写互斥

rtx4中标准库用到的互斥量,rtx的实现代码在此,但是有问题,我记得keil官方论坛有人讨论过这个问题


  1. /*--------------------------- _mutex_initialize -----------------------------*/

  2. int _mutex_initialize (OS_ID *mutex) {
  3.   /* Allocate and initialize a system mutex. */

  4.   if (nr_mutex >= OS_MUTEXCNT) {
  5.     /* If you are here, you need to increase the number OS_MUTEXCNT. */
  6.     for (;;);
  7.   }
  8.   *mutex = &std_libmutex[nr_mutex++];
  9.   mutex_init (*mutex);
  10.   return (1);
  11. }


  12. /*--------------------------- _mutex_acquire --------------------------------*/

  13. __used void _mutex_acquire (OS_ID *mutex) {
  14.   /* Acquire a system mutex, lock stdlib resources. */
  15.   if (runtask_id ()) {
  16.     /* RTX running, acquire a mutex. */
  17.     mutex_wait (*mutex);
  18.   }
  19. }


  20. /*--------------------------- _mutex_release --------------------------------*/

  21. __used void _mutex_release (OS_ID *mutex) {
  22.   /* Release a system mutex, unlock stdlib resources. */
  23.   if (runtask_id ()) {
  24.     /* RTX runnning, release a mutex. */
  25.     mutex_rel (*mutex);
  26.   }
  27. }
复制代码


回复

使用道具 举报

4

主题

37

回帖

49

积分

初级会员

积分
49
 楼主| 发表于 2018-9-19 22:34:14 | 显示全部楼层
myxiaonia 发表于 2018-9-19 21:33
用stdio的话是会有互斥的问题,比较io这种流设备肯定是独占访问的,具体的话就是读操作会有读互斥,写会 ...

恩,我对比了下,RTX4和RTX5在这里是不一样的,RTX5用函数重新封装了下,具体怎么获取互斥量就不清楚了,不过也是有问题的。
回复

使用道具 举报

4

主题

37

回帖

49

积分

初级会员

积分
49
 楼主| 发表于 2018-9-19 22:35:06 | 显示全部楼层
myxiaonia 发表于 2018-9-19 21:33
用stdio的话是会有互斥的问题,比较io这种流设备肯定是独占访问的,具体的话就是读操作会有读互斥,写会 ...

不过不清楚为什么RTX4有这样的问题,但是到了RTX5,怎么还没有解决。
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
106685
QQ
发表于 2018-9-22 09:26:55 | 显示全部楼层
yswtxiao 发表于 2018-9-19 22:35
不过不清楚为什么RTX4有这样的问题,但是到了RTX5,怎么还没有解决。

自己写个简单的scanf就好了,串口专用
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
106685
QQ
发表于 2018-9-22 09:43:23 | 显示全部楼层
myxiaonia 发表于 2018-9-19 21:33
用stdio的话是会有互斥的问题,比较io这种流设备肯定是独占访问的,具体的话就是读操作会有读互斥,写会 ...

FlahFS的API使用这个没问题的,多任务情况下加大heap大小可解决。

http://www.armbbs.cn/forum.php?m ... p;highlight=FlashFS

回复

使用道具 举报

4

主题

37

回帖

49

积分

初级会员

积分
49
 楼主| 发表于 2018-9-25 10:24:52 | 显示全部楼层
eric2013 发表于 2018-9-22 09:43
FlahFS的API使用这个没问题的,多任务情况下加大heap大小可解决。

http://www.armbbs.cn/forum.php ...

嗯,RTX5我也确认了,修改启动文件里面的堆大小就解决了。
结贴了,问题已经找到了。
回复

使用道具 举报

4

主题

37

回帖

49

积分

初级会员

积分
49
 楼主| 发表于 2018-9-25 10:26:45 | 显示全部楼层
eric2013 发表于 2018-9-22 09:43
FlahFS的API使用这个没问题的,多任务情况下加大heap大小可解决。

http://www.armbbs.cn/forum.php ...

不过我还是奇怪,为什么用了文件系统之后就需要用这个堆,你在另一个帖子上说的互斥信号量的申请应该用的是RTX5内存池里面的空间呀,这个空间应该是调用标准C库函数malloc函数时从这里获取的吗?
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
106685
QQ
发表于 2018-9-26 08:54:05 | 显示全部楼层
yswtxiao 发表于 2018-9-25 10:26
不过我还是奇怪,为什么用了文件系统之后就需要用这个堆,你在另一个帖子上说的互斥信号量的申请应该用的 ...

这个得搜下mdk的help文档,看看都那些C标准库函数(包括文件系统的API)需要在运行的实现使用堆空间。
回复

使用道具 举报

0

主题

4

回帖

4

积分

新手上路

积分
4
发表于 2018-10-15 16:08:00 | 显示全部楼层
本帖最后由 liankong123 于 2018-10-23 13:03 编辑
eric2013 发表于 2018-9-22 09:43
FlahFS的API使用这个没问题的,多任务情况下加大heap大小可解决。

http://www.armbbs.cn/forum.php ...

O(∩_∩)O谢谢分享,好人一生平安,问题已经解决
回复

使用道具 举报

0

主题

4

回帖

4

积分

新手上路

积分
4
发表于 2018-10-23 13:04:00 | 显示全部楼层
O(∩_∩)O谢谢分享,
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|小黑屋|Archiver|手机版|硬汉嵌入式论坛

GMT+8, 2024-4-29 15:03 , Processed in 0.353950 second(s), 28 queries .

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2023, Tencent Cloud.

快速回复 返回顶部 返回列表