杨为民 发表于 2024-5-8 12:30:20

fanxsp 发表于 2024-5-8 12:21
还是要关总中断的,只是在任务切换过程,不用全程关总中断,只关一小段时间。 ...

再试试,我认为你写的和tzz1983移植到STC8H上的uC/OS都可以实现“不关闭总中断”的版本

tzz1983 发表于 2024-5-8 12:38:34

杨为民 发表于 2024-5-8 12:30
再试试,我认为你写的和tzz1983移植到STC8H上的uC/OS都可以实现“不关闭总中断”的版本
...

我有关中断的,只是切换上下文时没有关中断,而访问OS核心全局变时是短暂的关中断的, 写?C_XBP无法用一条指令完成,也是关中断写的。 这个和CosyOS是不一样。

CosyOS 那种理论是没有问题的,用不用那是取舍的问题, 而不是对错的问题。

西红柿牛柳 发表于 2024-5-8 14:09:35

支持支持,强烈支持

fanxsp 发表于 2024-5-8 16:59:26

本帖最后由 fanxsp 于 2024-5-8 17:00 编辑

tzz1983 发表于 2024-5-8 09:50
我发现你的进出临界区的代码很高效。所以我新做的移植参照你的临界区的做法。

现在发现一个有意思的小细 ...
#include <reg51.h>

void main(void)
{
      unsigned char sum ;
      
      EA = 0 ;
      sum++ ;
      
      if(--sum == 0) EA = 1 ;
      
      if(!(--sum)) EA = 1 ;
}

      RSEG?DT?main?MAIN
?main?BYTE:
      sum?040:   DS   1
; #include <reg51.h>
;
; void main(void)

      RSEG?PR?main?MAIN
main:
                        ; SOURCE LINE # 3
; {
                        ; SOURCE LINE # 4
;         unsigned char sum ;
;         
;         EA = 0 ;
                        ; SOURCE LINE # 7
      CLR          EA
;         sum++ ;
                        ; SOURCE LINE # 8
      INC          sum?040
;         
;         if(--sum == 0) EA = 1 ;
                        ; SOURCE LINE # 10
      DJNZ         sum?040,?C0001
      SETB         EA
?C0001:
;         
;         if(!(--sum)) EA = 1 ;
                        ; SOURCE LINE # 12
      DJNZ         sum?040,?C0003
      SETB         EA
;         
; }                        ; SOURCE LINE # 14
?C0003:
      RET         
; END OF main

      END
我用这个最简单的程序,编译结果是一样的,你有空的话,再试一下。

tzz1983 发表于 2024-5-8 19:00:03

fanxsp 发表于 2024-5-8 16:59
#include

void main(void)


?PR?main?MAIN      SEGMENT CODE
?DT?main?MAIN      SEGMENT DATA OVERLAYABLE
        EXTRN        CODE (?C_STARTUP)
        PUBLIC        main

        RSEG?DT?main?MAIN
?main?BYTE:
      sum?040:   DS   1
;
; #include <reg51.h>
;
;
; void main(void)

        RSEG?PR?main?MAIN
main:
        USING        0
                        ; SOURCE LINE # 5
; {
                        ; SOURCE LINE # 6
;   unsigned char sum ;
;         
;   EA = 0 ;
                        ; SOURCE LINE # 9
        CLR        EA
;   sum++ ;
                        ; SOURCE LINE # 10
        INC        sum?040
;         
;   if(--sum == 0) EA = 1 ;
                        ; SOURCE LINE # 12
        DEC        sum?040
        MOV        A,sum?040
        JNZ        ?C0001
        SETB         EA
?C0001:
;         
;   if(!(--sum)) EA = 1 ;
                        ; SOURCE LINE # 14
        DJNZ         sum?040,?C0003
        SETB         EA
; }                        ; SOURCE LINE # 15
?C0003:
        RET       
; END OF main

        END

fanxsp 发表于 2024-5-8 19:36:59



编译器 版本一样的啊,真是莫明其妙啊

fanxsp 发表于 2024-5-8 19:49:34

本帖最后由 fanxsp 于 2024-5-8 19:56 编辑


tzz1983 发表于 2024-5-8 19:51:10

fanxsp 发表于 2024-5-8 19:49


应该是我有两年没更新了,刚才官网上看了一下,ARM C51 C251 都比我用的新{:shutup:}

tzz1983 发表于 2024-5-8 19:56:34

fanxsp 发表于 2024-5-8 19:49


可以了,和你的结果是一样的, {:victory:} 你把两个附件撤了吧

fanxsp 发表于 2024-5-9 07:48:37

tzz1983 发表于 2024-5-8 19:56
可以了,和你的结果是一样的,你把两个附件撤了吧

这样看来,还是写成 if(!(--EnterSum)), 这种形式更靠谱一些,if(--EnterSum == 0)这种形式,可能有些版本,不会优化。
页: 11 12 13 14 15 16 17 18 19 20 [21] 22 23 24 25 26 27 28 29
查看完整版本: 原创极简的51-MCU专用RTOS TinyRTOS51