对 ChipON 工具链---IDE集成开发环境 的一点建议
试用了一下 ChipON ---IDE集成开发环境,有点心得,提点建议,供今后升级时参考。1. ASM 编译器
编译器不支持负号,如 MOV R0, #-1编译出错,一定要写成MOV R0, #0xff 才行。
2. C 编译器
启动文件 STARTUP.o 单独列出,充许用户可修改,便于应对不断扩容推出的 ChipON 芯片。
页面切换指令(包括 RAM 和 ROM 页切换)单独列出,在头文件中,以宏的方式定义,这样,用户可修改,以便取得最佳编之译结果。
标准库分 V1核 和 V2核, 再加一个 精简的 V2核库(不带硬件乘除法),对目前的芯片,足够用了。今后有新核芯片推出,再增加库。
对 V1核的编译器,数据(变量)结构,俺做 精简库 时已考虑了,占用 R0,R1,R6,R7 四个寄存器 及 8级模拟软栈(每个中断需多增加一组模拟软栈,STKxx 参数变量,中断保护栈需和模拟软栈定义在同一页)。
这样,能在中断中,能任意调用 乘除法及取模操作(包括浮点数运算),带参函数调用及指针操作(长度限在 8个BYTE 之内)。
对 V2核的编译器,由于RAM容量一般较大,用上述 数据(变量)结构,中断实时响应,执行效率不高。
因此建议,在 BANK 有 3个及以上时(标准 V2核都达标的),将 STKxx 参数变量 设计成 多页(镜像), ChipON V2核有两级中断,这样,有1个主页STKxx 参数变量,外加2页 STKxx 参数变量镜像即可。
注:1个镜像中,包含 STKxx 参数变量 ,中断保护栈 和 模拟软栈 。
这样, 在中断时,无需保存 STKxx 参数变量,只需要切换一下镜像指针,可减少中断对RAM的保护,加快中断程序执行,如果能改成每级中断保护占用一个Rn寄存器(目前占用两个),两级中断用去两个 Rn, 这样,程序可占用 Rn 六个寄存器,能更优化标准库,加快库程序的执行速度及效率。
这样改造后,中断响应处理事件速度加快,在中断中,除了能任意调用 乘除法及取模操作(包括浮点数运算),带参函数调用及指针操作(参数长度限制 和主程序标准相同)。
另外,再探讨一下 函数调用时,C编译器的处理方式,如果依现在的方式,将参数全部读入内部暂时变量中,释放STKxx 参数变量 占用,则模拟软栈 可取消,库函数所用到的 一些临时变量,直接在 入参的 STKxx 参数变量 之后 地址,以直接寻址方式 加入程序处理,库程序可做的更简洁更优化,执行速度更快。
3. DEBUG 调试
像 反汇编窗口,必须要有的,最好能增加 混合反汇编窗口,便于单步调试跟踪查错。
多开几个 对 变量,RAM, 标签 窗口,最好能同时多打开几个,市面上的流行软件,一般能同时打开 4个 窗口。
加入的 标签能指定类型结构,以 指定的类型 显示,如 int, long, float。
这样,由于技术的原因,对 C中的变量,识别率不高,无法显示的缺陷,可在很大程度,通过用户 自定义标签 解决之。
{:victory:}{:victory:} 补充一条
1. ASM 编译器
编译器宏定义,不支持指令中内含的"#",如 MOV R0, #0xff编译出错,试了多种写法,想避开宏中的 "#","##", 都没有成功。 关于V2核 C编译器的 参数变量 格式,设想如下:
方案1, 标准版:
在 x页中,设置 STK00~STK19, 共20个连续变量,入口参数变量,从 STK00 开始往下递增,而库函数使用的临时变量 ,从 STK19 开始往上递减,库函数一般使用6个(包括浮点数运算),当有超越函数计算时,要用到 8个,这样,入口参数变量,最多用到 12~14个,和原编译器一致,如果 改进编译器,将每级中断保护占用的 2个Rn寄存器,改为占用 1个, 则库函数使用的临时变量 ,可再减少 2个(用Rn替代)。
sharebank.udata0x70
STK_P .res 1 ;STK切换指针
sharebank0 .udata0x80 // 在 x页中
STK19 .res 1 ;共20字节STK
STK18 .res 1
......
STK01 .res 1
STK00 .res 1
sharebank1 .udata0x180 // 在 x+1页中(起始地址需一致)
I0_STK .res 20 ;共20字节STK镜像
I0_PSW .res 1
I0_BANK .res 1
I0_PCH .res 1
I0_R0 .res 1
I0_R1 .res 1
I0_R6 .res 1
I0_R7 .res 1
sharebank2 .udata0x280 // 在 x+2页中(起始地址需一致)
I1_STK .res 20 ;共20字节STK镜像
I1_PSW .res 1
I1_BANK .res 1
I1_PCH .res 1
I1_R0 .res 1
I1_R1 .res 1
I1_R6 .res 1
I1_R7 .res 1
方案2,标准版2:
同方案1, 只是将 在中断保护占用的 RAM 区域移至 0x70~0x7f 区域。
sharebank.udata0x70
STK_P .res 1 ;STK切换指针
I0_PSW .res 1
I0_BANK .res 1
I0_PCH .res 1
I0_R0 .res 1
I0_R1 .res 1
I0_R6 .res 1
I0_R7 .res 1
I1_PSW .res 1
I1_BANK .res 1
I1_PCH .res 1
I1_R0 .res 1
I1_R1 .res 1
I1_R6 .res 1
I1_R7 .res 1
sharebank0 .udata0x80 // 在 x页中
STK19 .res 1 ;共20字节STK
STK18 .res 1
......
STK01 .res 1
STK00 .res 1
sharebank1 .udata0x180 // 在 x+1页中(起始地址需一致)
I0_STK .res 20 ;共20字节STK镜像
sharebank2 .udata0x280 // 在 x+2页中(起始地址需一致)
I1_STK .res 20 ;共20字节STK镜像
方案3, 精简版:
基本同方案1,只是将 在中断保护占用的 RAM 区域,部分移至 0x70~0x7f 区域(也可放在STK镜像后面),部分占用 STKxx中间段的,比如,本例中,库程序用到的4个Rn寄存器,在中断中,移入保护在 STK13, STK12, STK11, STK10 中。这样,中断中充许调用的参数,除长度略为短点,其他功能不受影响。
sharebank.udata0x70
STK_P .res 1 ;STK切换指针
I0_PSW .res 1
I0_BANK .res 1
I0_PCH .res 1
I1_PSW .res 1
I1_BANK .res 1
I1_PCH .res 1
sharebank0 .udata0x80 // 在 x页中
STK19 .res 1 ;共20字节STK
STK18 .res 1
......
STK01 .res 1
STK00 .res 1
sharebank1 .udata0x180 // 在 x+1页中(起始地址需一致)
I0_STK .res 20 ;共20字节STK镜像
sharebank2 .udata0x280 // 在 x+2页中(起始地址需一致)
I1_STK .res 20 ;共20字节STK镜像
V2核 的芯片,在RAM 较大时,个人偏向 方案1 或 方案2(如C编译器不能有效合理使用0x70~0x7f区域,使用方案2 更省RAM,更精简优化程序)。
V2核 的芯片,在RAM 较小时,个人偏向 方案3。
最好能将其设置功能整合在 STARTUP.o 中,做成用户可修改的形式,适合不同层次的用户群使用。
如果 改进编译器,将每级中断保护占用的 2个Rn寄存器,改为占用 1个。
则C程序中,能使用的Rn寄存器, 增加到 6个,这样,建议参数设置格式如下:
参数: STK00, STK01, STK02, STK03, STK04, STK05 ......
镜像: R0 , R1 , R2 , R3
函数参数传递:
参数先依次 放入R0~R3中,余下的参数,依次放入STK04, STK05 ...... 中。
函数返回 放R0~R3中。
例如: longIMUL (int a, long b);
a --> R0, R1
b --> R2, R3, STK04, STK05
返回 --> R0, R1, R2, R3
这样做的好处,不但子程序调用前入参速度加快,更能让库函数提高优化程度。并且像 V2核的 MCU, 带硬件乘除器,但相关特殊寄存器放在 BANK1 中,如入参放在 STKxx 中,来回的BANK切换折腾,挺消耗ROM容量和影响运行速度的,放在 Rn中, 能大大地简化程序,加快程序运行速度。
另外,函数返回参数 程序也相应简化,回送速度也加快,因为 Rn参数送至 变量,明显比 STKxx参数送至 变量 ,执行效率要高许多!
至于 暂时未用,空出的 STK00, STK01, STK02, STK03 这 4个字节,在库函数中,作为中间变量使用(不用再格外增加临时变量)。
页:
[1]