杨为民
发表于 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)这种形式,可能有些版本,不会优化。