硬汉嵌入式论坛

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

[RL-FlashFS] 关于Retarget.c文件理解,希望硬汉哥指点下

[复制链接]

7

主题

25

回帖

46

积分

新手上路

积分
46
发表于 2023-7-16 20:50:56 | 显示全部楼层 |阅读模式
1.

[C] 纯文本查看 复制代码
FILEHANDLE _sys_open (const char *name, int openmode) {
  /* Register standard Input Output devices. */
  if (strcmp(name, "STDIN") == 0) {
    return (STDIN);
  }
  if (strcmp(name, "STDOUT") == 0) {
    return (STDOUT);
  }
  if (strcmp(name, "STDERR") == 0) {
    return (STDERR);
  }
  return (__sys_open (name, openmode));
}


对于_sys_open 调用路径fopen->freopen->_sys_open->__sys_open,这里__sys_open应该就是rl-flashfs实现的,其中STDIN STDOUT STDERR这三个流rl-flashfs会自动创建吗,所以File_Configs中的Number of open files最小为4?

2.
[C] 纯文本查看 复制代码
int _sys_istty (FILEHANDLE fh) {
  if (fh > 0x8000) {
    return (1);
  }
  return (0);
}

_sys_istty这个函数是确认是否有类似打印设备,0x8000是设备地址?

3.int _sys_write (FILEHANDLE fh, const U8 *buf, U32 len, int mode) {
#ifdef STDIO
  if (fh == STDOUT) {
    /* Standard Output device. */
    for (  ; len; len--) {
      sendchar (*buf++);
    }
    return (0);
  }
#endif
  if (fh > 0x8000) {
    return (-1);
  }
  return (__sys_write (fh, buf, len));
}
fprintf调用路径fprintf->fputc->fwrite->_sys_write,用的就是STDOUT,所以这里sendchar自己实现就可以用串口打印printf,如果直接重写fputc,那rl-flashfs就没法写了

4.标志输入和标志输出相同

5.void _sys_exit (int return_code) {
  /* Endless loop. */
  //while (1);
}
这个函数貌似应该不会调用,但是我现在的工程运行后就被调用了,所以把wihle注释了,这有什么影响吗



回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
106731
QQ
发表于 2023-7-17 09:56:41 | 显示全部楼层
1、Number of open files最小为4,应该没有这个限制。这个应该仅仅限制的FlashFS文件操作。
2、其它的没研究过,就这个 _sys_write我用于做串口打印了。

MDK的C库不是开源的,我们只能参考newlib,libc这种C库方便对照分析。
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-5-2 15:42 , Processed in 0.246629 second(s), 26 queries .

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2023, Tencent Cloud.

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