_奶咖君_
发表于 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)