找回密码
 立即注册
楼主: fan***

原创极简的51MCU专用RTOS TinyRTOS51

[复制链接]

该用户从未签到

61

主题

622

回帖

1万

积分

荣誉版主

积分
10818
发表于 2024-3-31 17:29:22 | 显示全部楼层
楼主你好:

(1)我注意到你的RTOS有一个明显的特点,你的整个程序都没有使用“可重入函数”定义。对于使用C51编译器的RTOS一般而言这个做法是令人震惊的
(2)比如你的RTOS系统函数:
Fig_01_TRTx51_无声明.jpg

就没有使用“可重入函数”定义。
但是同样是使用C51编译器的uC/OS-II中的对应函数:
Fig_02_uCOSII_有声明.jpg

却使用了“可重入函数”定义“reentrant”关键字
(3)我的问题有两个,首先是你认为你的“OSDelay”函数在实际使用时会发生“重入现象”吗?其次是如果会,你对该函数不使用“可重入函数”定义“reentrant”关键字的理由是什么?能给我们介绍一下吗?


回复 支持 反对 送花

使用道具 举报

  • TA的每日心情
    奋斗
    3 小时前
  • 签到天数: 154 天

    [LV.7]常住居民III

    1

    主题

    96

    回帖

    453

    积分

    中级会员

    积分
    453
     楼主| 发表于 2024-3-31 17:39:56 | 显示全部楼层
    杨为民 发表于 2024-3-31 17:29
    楼主你好:

    (1)我注意到你的RTOS有一个明显的特点,你的整个程序都没有使用“可重入函数”定义。对于使 ...

    OSDelay()  会发生重入。但是只要这个函数所有的局部变量都是分配在寄存器里面。它就是可重入的。
    回复 支持 反对 送花

    使用道具 举报

  • TA的每日心情
    奋斗
    3 小时前
  • 签到天数: 154 天

    [LV.7]常住居民III

    1

    主题

    96

    回帖

    453

    积分

    中级会员

    积分
    453
     楼主| 发表于 2024-3-31 17:41:58 | 显示全部楼层
    本帖最后由 fanxsp 于 2024-3-31 17:46 编辑

    可以通过阅读汇编代码,来确认函数的局部变量是否全部都是分配在寄存器里面的。内核中的所有函数,都已经确认过。

    点评

    (1)你的思路是对的,除了“函数的局部变量”还要加上“函数的全部参数”。 (2)你的RTOS很有特点,简单易读。你能分主题(每个主题一个帖子,主题就直接显示在标题中)介绍这些特点吗?  详情 回复 发表于 2024-3-31 18:12
    那一定要仔细确认,包括形参在内。如在C51优化等级4级时确认无误,并在使用说明中注明C51优化等级的要求。  发表于 2024-3-31 18:03
    回复 支持 反对 送花

    使用道具 举报

  • TA的每日心情
    奋斗
    3 小时前
  • 签到天数: 154 天

    [LV.7]常住居民III

    1

    主题

    96

    回帖

    453

    积分

    中级会员

    积分
    453
     楼主| 发表于 2024-3-31 18:09:20 | 显示全部楼层
    本帖最后由 fanxsp 于 2024-3-31 18:12 编辑
    fanxsp 发表于 2024-3-31 17:41
    可以通过阅读汇编代码,来确认函数的局部变量是否全部都是分配在寄存器里面的。内核中的所有函数,都已经确 ...

    优化等级,在使用手册中有明确说明。确认局部变量是否全部分配在寄存器里,也不是很难。只要查看编译器是否给函数生成一个单独的保存局部变量和参数的段,就可以了。
    回复 支持 反对 送花

    使用道具 举报

    该用户从未签到

    61

    主题

    622

    回帖

    1万

    积分

    荣誉版主

    积分
    10818
    发表于 2024-3-31 18:12:01 | 显示全部楼层
    fanxsp 发表于 2024-3-31 17:41
    可以通过阅读汇编代码,来确认函数的局部变量是否全部都是分配在寄存器里面的。内核中的所有函数,都已经确 ...

    (1)你的思路是对的,除了“函数的局部变量”还要加上“函数的全部参数”。

    (2)你的RTOS很有特点,简单易读。你能分主题(每个主题一个帖子,主题就直接显示在标题中介绍这些特点吗?

    回复 支持 反对 送花

    使用道具 举报

  • TA的每日心情
    奋斗
    3 小时前
  • 签到天数: 154 天

    [LV.7]常住居民III

    1

    主题

    96

    回帖

    453

    积分

    中级会员

    积分
    453
     楼主| 发表于 2024-3-31 18:14:59 | 显示全部楼层
    本帖最后由 fanxsp 于 2024-3-31 18:26 编辑
    杨为民 发表于 2024-3-31 18:12
    (1)你的思路是对的,除了“函数的局部变量”还要加上“函数的全部参数”。

    (2)你的RTOS很有特点,简 ...

    对,参数也是局部变量。确认局部变量是否全部分配在寄存器里,也不是很难。只要查看编译器是否给函数生成一个单独的保存局部变量和参数的数据段,就可以了。
    如果有,汇编代码会在需要时把寄存器值保存到这个数据段,那函数就是不可重入的。如果没有这个数据段,函数就是可重入的。
    回复 支持 反对 送花

    使用道具 举报

    该用户从未签到

    61

    主题

    622

    回帖

    1万

    积分

    荣誉版主

    积分
    10818
    发表于 2024-3-31 18:52:32 | 显示全部楼层
    (1)你采用下图的方式来事先统一规划数据存放区,值得推荐,比uC/OS-II等只是规划了变量的数据类型更进了一步:
    Fig_03_TRTx51_pdata.jpg
    (2)我注意的你的堆栈数据好像是放在“pdata”中的,“#define OSLOC_STACKS       pdata      // 任务堆栈存储位置”。

    这种使用方法对于STC8H系列单片机好像很不常见,你能介绍一下你的考虑吗?


    回复 支持 反对 送花

    使用道具 举报

  • TA的每日心情
    奋斗
    3 小时前
  • 签到天数: 154 天

    [LV.7]常住居民III

    1

    主题

    96

    回帖

    453

    积分

    中级会员

    积分
    453
     楼主| 发表于 2024-3-31 18:56:24 | 显示全部楼层
    本帖最后由 fanxsp 于 2024-3-31 19:00 编辑
    杨为民 发表于 2024-3-31 18:52
    (1)你采用下图的方式来事先统一规划数据存放区,值得推荐,比uC/OS-II等只是规划了变量的数据类型更进了 ...

    如果任务堆栈的总数小于 256字节,设为pdata可以减小代码量,和任务堆栈移动所需的时间。如果大于256 字节,要设为xdata。可以先设为pdata,如果编译时提示pdata满,就改为xdata.

    点评

    我是无理由的反对用 pdata, 防止将来不同的编译器会出错,另外 STC8H, xdata 比 pdata快  详情 回复 发表于 2024-3-31 19:54
    回复 支持 反对 送花

    使用道具 举报

    该用户从未签到

    551

    主题

    9237

    回帖

    1万

    积分

    管理员

    积分
    13955
    发表于 2024-3-31 19:54:31 | 显示全部楼层
    fanxsp 发表于 2024-3-31 18:56
    如果任务堆栈的总数小于 256字节,设为pdata可以减小代码量,和任务堆栈移动所需的时间。如果大于256 字节 ...

    我是无理由的反对用 pdata, 防止将来不同的编译器会出错,
    另外 STC8H, xdata 和 pdata 的速度差不多


    少用 pdata, 这东西现在讲不清了,P2口控制 XRAM 分页,在哪 ?  没法讲了
    大家再也不要用 pdata

    回复 支持 反对 送花

    使用道具 举报

  • TA的每日心情
    奋斗
    3 小时前
  • 签到天数: 154 天

    [LV.7]常住居民III

    1

    主题

    96

    回帖

    453

    积分

    中级会员

    积分
    453
     楼主| 发表于 2024-3-31 20:06:10 | 显示全部楼层
    本帖最后由 fanxsp 于 2024-3-31 20:10 编辑
    神农鼎 发表于 2024-3-31 19:54
    我是无理由的反对用 pdata, 防止将来不同的编译器会出错,另外 STC8H, xdata 比 pdata快

    pdata  xdata  用户是可配置的,可以根据实际情况而定。主要原因是,pdata的指针是 1个字节,xdata 的指针是2个字节。

    点评

    (1)16位的MOVX指令 1)MOVX A,@DPTR; 2)MOVX @DPTR, A; 在这两条指令中:DPTR为16 bit地址寄存器,地址高8 bit存于DPH,地址低8 bit存于DPL。 用这两条指令中,CPU既可以存取外部XRAM存储器,也可以存取片内  详情 回复 发表于 2024-3-31 21:07
    (1)既然是“用户是可配置的”,那就不要用PDATA数据类型。 (2)PDATA的用法见下图:C51的帮助手册: [attachimg]40161[/attachimg] 上面那段话百度翻译为: XDATA存储器类可以通过寄存器DPTR与指令MOVX一起访  详情 回复 发表于 2024-3-31 20:34
    回复 支持 反对 送花

    使用道具 举报

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

    本版积分规则

    QQ|手机版|深圳国芯人工智能有限公司 ( 粤ICP备2022108929号-2 )

    GMT+8, 2024-4-30 10:47 , Processed in 0.070321 second(s), 67 queries .

    Powered by Discuz! X3.5

    © 2001-2024 Discuz! Team.

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