_奶咖君_ 发表于 2025-9-25 11:19:45

网老四 发表于 2025-9-25 11:09
两次就两次,配置参数又不是每时每刻都要操作,
系统时钟支持高些,速度换性能 ...
两次不就打破了原子性了么。。。感觉还是有区别。
而且论坛里面,也有不少因为两次读取导致出问题的情况。
{:xiaojiujie:}

如果是 一次 ,,这种问题是不是可以避免呢

网老四 发表于 2025-9-25 12:02:45

_奶咖君_ 发表于 2025-9-25 11:19
两次不就打破了原子性了么。。。感觉还是有区别。
而且论坛里面,也有不少因为两次读取导致出问题的情况。 ...

接受现实吧,为了兼顾广大8位机用户,短时间是没法改变这种现状的
要么等ARM核的型号出来.
再说,即使纯32位处理器,也会有同样也会原子操作问题.这东西只能靠编程技巧来规避了.

Ayb_ice 发表于 2025-9-25 13:09:23

网老四 发表于 2025-9-25 11:09
两次就两次,配置参数又不是每时每刻都要操作,
系统时钟支持高些,速度换性能 ...

光配置吗,你不读取吗

lgwd 发表于 2025-9-25 14:32:33

重新设计一个单片机架构!性能相当STM32,甚至超过STM32。使用起来又像51那么简单!C51也能支持!看谁来实现这个梦想?

_奶咖君_ 发表于 2025-9-25 15:20:21

网老四 发表于 2025-9-25 12:02
接受现实吧,为了兼顾广大8位机用户,短时间是没法改变这种现状的
要么等ARM核的型号出来.
再说,即使纯32位 ...
话说,一次性读取16位或者32位,是编译器要做的事情,还是芯片要做的事情。前提是芯片的数据总线已经是32位的情况下。


我看现有的8051U 数据总线已经是32位了,,地址总线24位。。应该是允许一次性读取32位数据的。。

网老四 发表于 2025-9-25 16:49:10

_奶咖君_ 发表于 2025-9-25 15:20
话说,一次性读取16位或者32位,是编译器要做的事情,还是芯片要做的事情。前提是芯片的数据总线已经是32 ...

应该跟编译器有关吧,对32位读写真正高需求的场合,换其他芯片就是.
硬件做再好,没编译器支持也是白瞎,这也是STC一个发展瓶颈了,C51和C251编译器,基本没人维护了.
如果还要发展32位51,未来必然要解决这个问题.不然只能转向ARM之类构架.

_奶咖君_ 发表于 2025-9-26 09:55:58

网老四 发表于 2025-9-25 16:49
应该跟编译器有关吧,对32位读写真正高需求的场合,换其他芯片就是.
硬件做再好,没编译器支持也是白瞎,这也 ...

说的对啊,,我也是觉得输就输在编译器上了。

看着这么好的东西发挥不出来就和难受。。。痛心疾首啊{:zhuakuang:}

zxcv1973 发表于 2025-9-26 12:04:45

_奶咖君_ 发表于 2025-9-26 09:55
说的对啊,,我也是觉得输就输在编译器上了。

看着这么好的东西发挥不出来就和难受。。。痛心疾首啊 ...

看别人搞个C编译器很容易啊,都是移植GCC或LLVM的,看有个人用台湾一家的MCU,厂家没有提供C编译器,就自己用LLVM做了一个C编译器

lgwd 发表于 2025-9-26 12:26:20

自己设计一个最优秀的单片机架构,再鼓捣一个C编译器,你可以做出世界最强大的单片机!

angmall 发表于 2025-9-26 14:13:35

Ayb_ice 发表于 2025-9-24 11:21
不要将来啊,现在就应该支持

是的,现在就应该支持了,你可以用Ai8051U



sfr16   T2_16         =         0xd6;
#define T11_16                  (*(unsigned int volatile far *)0x7efe7a)


168          void TIMER2_Init(void)
169          {
170   1      #define T2_PSCR               (1)
171   1      #define T2_RELOAD               (65536 - (float)SYSCLK / 12 / (T2_PSCR + 1) * 10 / 1000)
172   1      
173   1          TIMER2_TimerMode();               //设置定时器2为定时模式
174   1          TIMER2_12TMode();                   //设置定时器2为12T模式
175   1          TIMER2_EnableInt();               //使能定时器2中断
176   1          TIMER2_SetPrescale(T2_PSCR);      //设置定时器2的8位预分频
177   1      //    TIMER2_SetReload16(T2_RELOAD);      //设置定时器2的16位重载值
178   1          T2_16 = (T2_RELOAD);
179   1          TIMER2_Run();                     //定时器2开始运行
180   1      
181   1          //<<AICUBE_USER_TIMER2_INITIAL_BEGIN>>
182   1          // 在此添加用户初始化代码
183   1      
184   1      
185   1          //<<AICUBE_USER_TIMER2_INITIAL_END>>
186   1      }

;       FUNCTION TIMER2_Init (BEGIN)
                                                ; SOURCE LINE # 168
                                                ; SOURCE LINE # 173
000000 538EF7         ANL      AUXR,#0F7H
                                                ; SOURCE LINE # 174
000003 538EFB         ANL      AUXR,#0FBH
                                                ; SOURCE LINE # 175
000006 43AF04         ORL      IE2,#04H
                                                ; SOURCE LINE # 176
000009 7401         MOV      A,#01H         ; A=R11
00000B 7E34FEA2       MOV      WR6,#0FEA2H
00000F 7E24007E       MOV      WR4,#07EH
000013 7A1BB0         MOV      @DR4,R11         ; A=R11
                                                ; SOURCE LINE # 178
000016 7E34BEE5       MOV      WR6,#0BEE5H
00001A 7A71D6         MOV      T2_16,R7
00001D 7A61D7         MOV      T2_16+1,R6
                                                ; SOURCE LINE # 179
000020 438E10         ORL      AUXR,#010H
                                                ; SOURCE LINE # 186
000023 22             RET   

193          void TIMER11_Init(void)
194          {
195   1      #define T11_PSCR                (0)
196   1      #define T11_RELOAD            (65536 - (float)SYSCLK / 12 / (T11_PSCR + 1) * 100 / 1000000)
197   1      
198   1          TIMER11_CLK_SYSCLK();               //定时器11使用系统时钟作为时钟源
199   1      
200   1          TIMER11_TimerMode();                //设置定时器11为定时模式
201   1          TIMER11_12TMode();                  //设置定时器11为12T模式
202   1          TIMER11_EnableInt();                //使能定时器11中断
203   1          TIMER11_SetPrescale(T11_PSCR);      //设置定时器11的8位预分频
204   1      //    TIMER11_SetReload16(T11_RELOAD);    //设置定时器11的16位重载值
205   1          T11_16 = (u16)(T11_RELOAD);
206   1          TIMER11_Run();                      //定时器11开始运行
207   1      
208   1          //<<AICUBE_USER_TIMER11_INITIAL_BEGIN>>
209   1          // 在此添加用户初始化代码
210   1      
211   1      
212   1          //<<AICUBE_USER_TIMER11_INITIAL_END>>
213   1      }

;       FUNCTION TIMER11_Init (BEGIN)
                                                ; SOURCE LINE # 193
                                                ; SOURCE LINE # 198
000000 7E34FE78       MOV      WR6,#0FE78H
000004 7E24007E       MOV      WR4,#07EH
000008 7E1BB0         MOV      R11,@DR4         ; A=R11
00000B 54F3         ANL      A,#0F3H          ; A=R11
00000D 7A1BB0         MOV      @DR4,R11         ; A=R11
                                                ; SOURCE LINE # 200
000010 7E1BB0         MOV      R11,@DR4         ; A=R11
000013 54BF         ANL      A,#0BFH          ; A=R11
000015 7A1BB0         MOV      @DR4,R11         ; A=R11
                                                ; SOURCE LINE # 201
000018 7E1BB0         MOV      R11,@DR4         ; A=R11
00001B 54EF         ANL      A,#0EFH          ; A=R11
00001D 7A1BB0         MOV      @DR4,R11         ; A=R11
                                                ; SOURCE LINE # 202
000020 7E1BB0         MOV      R11,@DR4         ; A=R11
000023 4402         ORL      A,#02H         ; A=R11
000025 7A1BB0         MOV      @DR4,R11         ; A=R11
C251 COMPILER V5.60.0,main                                                               26/09/2513:44:25PAGE 9   

                                                ; SOURCE LINE # 203
000028 E4             CLR      A                ; A=R11
000029 7E14FE79       MOV      WR2,#0FE79H
00002D 7E04007E       MOV      WR0,#07EH
000031 7A0BB0         MOV      @DR0,R11         ; A=R11
                                                ; SOURCE LINE # 205
000034 7E54FEB2       MOV      WR10,#0FEB2H
000038 7E14FE7A       MOV      WR2,#0FE7AH
00003C 1B0A50         MOV      @DR0,WR10
                                                ; SOURCE LINE # 206
00003F 7E1BB0         MOV      R11,@DR4         ; A=R11
000042 4480         ORL      A,#080H          ; A=R11
000044 7A1BB0         MOV      @DR4,R11         ; A=R11
                                                ; SOURCE LINE # 213
000047 22             RET      
;       FUNCTION TIMER11_Init (END)




页: 1 [2] 3
查看完整版本: 强烈建议stc32增加16位32位特殊功能寄存器