打印
[华山论剑]

对 ChipON 工具链---IDE集成开发环境 的一点建议

[复制链接]
1539|4
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
laoxu|  楼主 | 2016-7-20 09:33 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
试用了一下 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中的变量,识别率不高,无法显示的缺陷,可在很大程度,通过用户 自定义标签 解决之。


沙发
Jim12345| | 2016-7-20 10:40 | 只看该作者

使用特权

评论回复
板凳
laoxu|  楼主 | 2016-7-21 04:58 | 只看该作者
补充一条
1. ASM 编译器
   编译器宏定义,不支持指令中内含的"#",如 MOV   R0, #0xff  编译出错,试了多种写法,想避开宏中的 "#","##", 都没有成功。

使用特权

评论回复
地板
laoxu|  楼主 | 2016-7-21 05:50 | 只看该作者
关于V2核 C编译器的 参数变量 格式,设想如下:

方案1, 标准版:
在 x页中,设置 STK00~STK19, 共20个连续变量,入口参数变量,从 STK00 开始往下递增,而库函数使用的临时变量 ,从 STK19 开始往上递减,库函数一般使用6个(包括浮点数运算),当有超越函数计算时,要用到 8个,这样,入口参数变量,最多用到 12~14个,和原编译器一致,如果 改进编译器,将每级中断保护占用的 2个Rn寄存器,改为占用 1个, 则库函数使用的临时变量 ,可再减少 2个(用Rn替代)。

sharebank  .udata  0x70  
    STK_P        .res   1              ;STK切换指针

sharebank0 .udata  0x80   // 在 x页中
    STK19        .res   1              ;共20字节STK
    STK18        .res   1
    ......
    STK01        .res   1
    STK00        .res   1

sharebank1 .udata  0x180   // 在 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 .udata  0x280   // 在 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  .udata  0x70  
    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 .udata  0x80   // 在 x页中
    STK19        .res   1              ;共20字节STK
    STK18        .res   1
    ......
    STK01        .res   1
    STK00        .res   1

sharebank1 .udata  0x180   // 在 x+1页中(起始地址需一致)
    I0_STK        .res   20              ;共20字节STK镜像


sharebank2 .udata  0x280   // 在 x+2页中(起始地址需一致)
    I1_STK        .res   20              ;共20字节STK镜像


方案3, 精简版:
基本同方案1,  只是将 在中断保护占用的 RAM 区域,部分移至 0x70~0x7f 区域(也可放在STK镜像后面),部分占用 STKxx中间段的,比如,本例中,库程序用到的4个Rn寄存器,在中断中,移入保护在 STK13, STK12, STK11, STK10 中。这样,中断中充许调用的参数,除长度略为短点,其他功能不受影响。

sharebank  .udata  0x70  
    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 .udata  0x80   // 在 x页中
    STK19        .res   1              ;共20字节STK
    STK18        .res   1
    ......
    STK01        .res   1
    STK00        .res   1

sharebank1 .udata  0x180   // 在 x+1页中(起始地址需一致)
    I0_STK        .res   20              ;共20字节STK镜像


sharebank2 .udata  0x280   // 在 x+2页中(起始地址需一致)
    I1_STK        .res   20              ;共20字节STK镜像


V2核 的芯片,在RAM 较大时,个人偏向 方案1 或 方案2(如C编译器不能有效合理使用0x70~0x7f区域,使用方案2 更省RAM,更精简优化程序)。

V2核 的芯片,在RAM 较小时,个人偏向 方案3。

最好能将其设置功能整合在 STARTUP.o 中,做成用户可修改的形式,适合不同层次的用户群使用。

使用特权

评论回复
5
laoxu|  楼主 | 2016-7-22 06:04 | 只看该作者
如果 改进编译器,将每级中断保护占用的 2个Rn寄存器,改为占用 1个。

则C程序中,能使用的Rn寄存器, 增加到 6个,这样,建议参数设置格式如下:

参数: STK00, STK01, STK02, STK03, STK04, STK05 ......
镜像: R0 ,   R1 ,   R2 ,   R3

函数参数传递:
参数先依次 放入R0~R3中,余下的参数,依次放入STK04, STK05 ...... 中。
函数返回 放R0~R3中。

例如: long  IMUL (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个字节,在库函数中,作为中间变量使用(不用再格外增加临时变量)。

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

个人签名:猜猜俺是谁的马夹?

146

主题

2274

帖子

221

粉丝