-
同样的程序, 在 stc8h 上测试, 工作正常.
测试结果: _nop_(); 一个都不加, 测试结果 time1 = 1
加一个 _nop_(); 测试结果 time1 =2
加二个 _nop_(); 测试结果 time1 = 3
加三个 _nop_(); 测试结果 time1 = 4
加四个 _nop_(); 测试结果 time1 = 5
-
言归正传!!!
经过多次更改程序(使用 DPTR0 和 DPTR1 的不同排列组合 及 前后次序) 测试, 得出以下结论.
1, STC的双 DPTR指针, 支持 XRAM 读入/写入, 完全正确, 工作正常.
2, STC的双 DPTR指针, 第一指针 DPTR0 支持 CODE 读入, 完全正确, 工作正常.
第二指针 DPTR1 完全不支持 CODE 读入, 一执行就玩蛋, 用 STC8H USB口仿真的直接死机(或数十秒才能退出),
用 STC8H 232口仿真的能退出, 但执行结果错误.
3, 最终结论是 STC的双 DPTR指针, 第二指针 DPTR1 完全不支持 CODE,
4, STC8H USB口仿真, 性能比 用 232口仿真的 差很多, 直观上看, 下载程序, 执行单步等, 用USB口仿真 比 用 232口 速度慢 2-3倍(估算),
执行到非法操作(比如前面提到的, 用 DPTR1读 ROM) , 可能死机退不出, 但用 232口仿真的, 能够正常退出.
-
经过多次更改程序(使用 DPTR0 和 DPTR1 的不同排列组合 及 前后次序) 测试, 得出以下结论.
1, STC的双 DPTR指针, 支持 XRAM 读入/写入, 完全正确, 工作正常.
2, STC的双 DPTR指针, 第一指针 DPTR0 支持 CODE 读入, 完全正确, 工作正常.
第二指针 DPTR1 完全不支持 CODE 读入, 一执行就玩蛋, 用 STC8H USB口仿真的直接死机(或数十秒才能退出),
用 STC8H 232口仿真的能退出, 但执行结果错误.
3, 最终结论是 STC的双 DPTR指针, 第二指针 DPTR1 完全不支持 CODE,
4, STC8H USB口仿真, 性能比 用 232口仿真的 差很多, 直观上看, 下载程序, 执行单步等, 用USB口仿真 比 用 232口 速度慢 2-3倍(估算),
执行到非法操作(比如前面提到的, 用 DPTR1读 ROM) , 可能死机退不出, 但用 232口仿真的, 能够正常退出.
-
huo_hu 发表于 2023-3-5 11:10
库本身不和实际结合就不好优化,比如如果是串口发送字符串,提出字符串数据直接送串口就行了,根本不用往 ...
内部函数库, 每个库都是独立的, 通过 约定寄存器或者 RAM传递 输入/输出参数.
-
huo_hu 发表于 2023-3-5 11:04
太细节的东西不仿真有困难
正解
-
在学习改写 Keil 字符串操作函数库(原型在 STRING.H 中)过程中, 发现原库 memmove 程序, 有一个 bug, 在将 code (或 xdata) 中内容 拷贝到 xdata中, 正向移动没问题, 反向移动时, 没有保护 指针返回的高位地址, 引起返回指针错误.
另外, 在将 code 中内容 拷贝到 xdata中, 程序中对移动地址作了判断, 决定采用正向移动还是反向移动, Keil 这段程序是多余的, 完全没必要, 因为51的CODE 和 XDATA 地址空间, 永远不会重叠, 这判断及反向移动, 我给优化了, 以精简代码提升执行速度.
MOVE_CODE_XDATA:
/* SETB C // Keil 这段程序是多余的, 因为C51的CODE和XDATA地址空间, 永远不会重叠
MOV A,R1
SUBB A,R0
MOV A,R2
SUBB A,R4
JNC MOVE_013
MOV A,R1
ADD A,R7
MOV DPL,A
MOV A,R2
ADDC A,R3
MOV DPH,A
MOV A,R0
ADD A,R7
MOV R0,A
MOV A,R4
ADDC A,R3
XCH A,R4 // Keil的BUG, 反向传送时, s1指针高位地址未保护, 现已修正
MOV R2,A // R4 -->R2
MOVE_010: INC DPL
DJNZ DPL,MOVE_011
DEC DPH
MOVE_011: DEC DPL
CLR A
MOVC A,@A+DPTR
XCH A,R0
XCH A,DPL
XCH A,R0
XCH A,R4
XCH A,DPH
XCH A,R4
INC DPL
DJNZ DPL,MOVE_012
DEC DPH
MOVE_012: DEC DPL
MOVX @DPTR,A
XCH A,R0
XCH A,DPL
XCH A,R0
XCH A,R4
XCH A,DPH
XCH A,R4
DJNZ R7,MOVE_010
DJNZ R6,MOVE_010
SJMP MOVE_END3 */
MOVE_013: MOV DPL,R1
MOV DPH,R2
MOV A,R4
MOV R2,A
MOVE_014: CLR A
MOVC A,@A+DPTR
........
下面为修正后的 memmove 程序, 可挂在 c51项目中编译, 以替代有错误的 memmove 库程序.
-
APT32F102X系列使用手册
APT32F1023B数据手册 V1.0
-
据说 APT32F1023B 24MHz 12位ADC 0.85元/PCS
-
huo_hu 发表于 2023-3-3 13:42
如果要搬运数据从ROM到XRAM我就用分页256字节的方式,不用倒腾DPTR
最低 256字节 xram 可以, 超范围就行不通了.
-
huo_hu 发表于 2023-3-3 13:34
以前也试过双指针,是根据例程改的,结果未能如预期,到底什么原因不太好追踪,主要是仿真程序在里面掺和着 ...
改写 Keil 字符串操作函数库(原型在 STRING.H 中), 优化精简代码, 提升执行速度.
所以要用到 双指针.
-
吾妻思萌 发表于 2023-3-3 06:41
会不会刚好碰见坏料了?
代码看着没问题啊
换了好几块板子, 故障依旧, 跑其他程序工作正常.
-
lugl4313820 发表于 2023-3-2 21:36
现在玩8位单片机,可能也是情怀了吧。大厂都转32位了。
确实是情怀, 仅玩一下其基本数据库函数.
-
yubinwu 发表于 2023-2-25 11:15
最笑死的居然叛变到STC
STC号称死太惨
正确的道路应该是从STC叛变到别的
中颖51, 自疫情的几年中, 一直买不到芯片, 现在也不正常, 搞不到芯片, 没办法~~~
-
后记:
我随意设断点, 单步或连续跟踪调试,发现该软件模拟传输测试程序不稳定, 时好时坏(查看数组, 传输的结果错误), 经不断更改断点位置, 单步或连续跟踪.
得出以下结论:
STC8H的仿真, 不支持第二个DPTR指针, 无论是单步, 还是连续, 只要在使用第二个DPTR指针过程中有停留(停顿), 就会出错, 永远停止第二个DPTR指针的工作!!!
像前面我调试 函数strcmp,strncmp,strcpy,strncpy,memcmp,memcpy,memccpy,memmove,就是在 双DPTR指针应用中, 加了断点, 造成STC8H的仿真过程中,
在第二个DPTR指针执行过程中有了停顿, 而产生第二个DPTR指针不工作的结果!
-
本帖最后由 xuyiyi 于 2023-2-24 19:19 编辑
damiaa 发表于 2023-2-20 09:51 我指的是编程风格。
那是老姚向STM32编程风格看齐。
我个人是反对的, 比如 51向STM8(STM32)编程风格看齐。
STM8是什么指令集? 继承扩展了原6502(6800)指令集, 6502指令集侧重于间接寻址, 原6502指令集间接寻址功能已经比 51强大太多了, 加上STM8扩充了6502(6800)指令集,
使用结构体指针, 如鱼得水. 对比之下, 使得原本就是 鸡肋的 51片外DPTR指针寻扯, 更放不上台面.
-
楼上库已更新 !!!
-
前几年看过一篇贴子, 好像 这种低挡的 M0, 核算下来 授权费 0.1元人民币/片, 现在估\计 几分钱/片.
听老妖吹, 其 STC33(M4核), 是买断的,
因此, 可能 ARM 公司的 版权 分 2种, 一种是一次性买断某个内核, 人民币 N万元.
另一种是每生产一片支付 版权费 几分到几元人民币(视挡次) , 也可能有上限, 生产的最多支付的 版权费 越低. 生产到一定量后(前面ARM公司已收了N多版权费了), 可能不再收取此种核的 版权费
-
damiaa 发表于 2023-2-17 11:25
有意思,stc51向stm32看齐
51向stm32看齐根本不可能, 尽管stm32(M3) 只是ARM的一个子集, 但其强大的间接寻址功能,
比 C251指令集都强大, 必竞 英特尔的 C251指令集, 是几十年前的老古董, 考虑的没那么超前,
而 M3指令集, 是ARM公司 10年内的产物,
stc51, 使用结构体指针, 使得原本就是 鸡肋的 51片外DPTR指针寻扯, 产生的效率奇低, 编译后代码一大堆(因为在同级别的 8位机中, 51的片外寻扯效率最低).
至于采用 C251指令集的 STC16/STC32, 模仿STM32 使用结构体指针, 还能凑合着用用.
-
#ifndef __STC_GPIO_H
#define __STC_GPIO_H
/***************************************************************************************
Model : STC_GPIO.H
Description : Head file of defining global variable.
Author : CLR
Create Time : 2023-04-17
Version ID : 2.0
用 途 :通用型, 能对宏晶 STC51/STC16/STC32系列MCU,
自动识别, 给出最优化的执行代码!
作 者 :许意义
21ic ID :LAOXU
中颖论坛 : bbs.21ic.com
****************************************************************************************/
//========================================================================
// 定义声明
//========================================================================
// 请注意, 为了便于下面的宏定义, GPIO输入输出模式, 与官方定义不同!!!
#define GPIO_PullUp 0L //上拉准双向口
#define GPIO_OUT_PP 1L //推挽输出
#define GPIO_HighZ 2L //浮空输入
#define GPIO_OUT_OD 3L //开漏输出
#define GPIO_Pin_0 0x01 //IO引脚 Px.0
#define GPIO_Pin_1 0x02 //IO引脚 Px.1
#define GPIO_Pin_2 0x04 //IO引脚 Px.2
#define GPIO_Pin_3 0x08 //IO引脚 Px.3
#define GPIO_Pin_4 0x10 //IO引脚 Px.4
#define GPIO_Pin_5 0x20 //IO引脚 Px.5
#define GPIO_Pin_6 0x40 //IO引脚 Px.6
#define GPIO_Pin_7 0x80 //IO引脚 Px.7
#define GPIO_Pin_LOW 0x0F //IO低4位引脚
#define GPIO_Pin_HIGH 0xF0 //IO高4位引脚
#define GPIO_Pin_All 0xFF //IO所有引脚
/*------------------------------------------------------------------------------------
===========编 程 实 例===========
------Cortex-M051风格1------
1.void GPIO_SET_MODE(Pn, b7,b6,b5,b4,b3,b2,b1,b0); // 设置IO口输入输出模式(n=0-7)
使用方式:
GPIO_SET_MODE(P3, PullUp,HighZ,PullUp,HighZ,OUT_PP,OUT_OD,OUT_PP,OUT_OD);
// 设置P3口的bit.7-bit.0位,依次为PullUp,HighZ,PullUp,HighZ,OUT_PP,OUT_OD,OUT_PP,OUT_OD模式
2.void GPIO_SET_PIN_MODE(Port, Pin_Mode); // 设置IO口其中1位或数位输入输出模式(N=0-7,i=0-7)
例如:
GPIO_SET_PIN_MODE(P3, OUT_OD_Pin6); // 设置P3口的第bit.6位为OUT_OD模式
GPIO_SET_PIN_MODE(P2, PullUp_Pin5 | OUT_PP_Pin2 | HighZ_Pin0); // 设置P2口的第bit.5位为PullUp模式,第bit.2位为OUT_PP模式,第bit.0位为HighZ模式
--------------------------------------------------------------------------------------*/
#define GPIO_SET_MODE(Port, b7,b6,b5,b4,b3,b2,b1,b0) Port##_SET_MODE(b7,b6,b5,b4,b3,b2,b1,b0)
#define GPIO_SET_PIN_MODE(Port, Pin_Mode) Port##_SET_PIN_MODE(Pin_Mode)
/*------------------------------------------------------------------------------------
------Cortex-M051风格2------
3.void Pn_SET_MODE(b7,b6,b5,b4,b3,b2,b1,b0); // 设置Pn IO口输入输出模式(n=0-4)
使用方式:
P3_SET_MODE(PullUp,HighZ,PullUp,HighZ,OUT_PP,OUT_OD,OUT_PP,OUT_OD);
// 设置P3口的bit.7-bit.0位,依次为PullUp,HighZ,PullUp,HighZ,OUT_PP,OUT_OD,OUT_PP,OUT_OD模式
4.void Pn_SET_PIN_MODE(Pin_Mode); // 设置Pn IO口其中1位或数位输入输出模式(N=0-7,i=0-7)
例如:
P3_SET_PIN_MODE(OUT_OD_Pin6); // 设置P3口的第bit.6位为OUT_OD模式
P2_SET_PIN_MODE(PullUp_Pin5 | OUT_PP_Pin2 | HighZ_Pin0); // 设置P2口的第bit.5位为PullUp模式,第bit.2位为OUT_PP模式,第bit.0位为HighZ模式
--------------------------------------------------------------------------------------*/
/*------------------------------------------------------------------------------------
-------51系列风格-------
5.u8 GPIO_Mode(b7,b6,b5,b4,b3,b2,b1,b0); 设置IO口输入输出模式
使用方式:
PnMode = GPIO_Mode(b7,b6,b5,b4,b3,b2,b1,b0); 设置IO口输入输出模式
P3Mode = GPIO_Mode(PullUp,HighZ,PullUp,HighZ,OUT_PP,OUT_OD,OUT_PP,OUT_OD);
// 设置P3口的bit.7-bit.0位,依次为PullUp,HighZ,PullUp,HighZ,OUT_PP,OUT_OD,OUT_PP,OUT_OD模式
--------------------------------------------------------------------------------------*/
-
下来看看