发新帖本帖赏金 3.00元(功能说明)我要提问
12下一页
返回列表
打印
[华山论剑]

“玩”的故事----精简 ChipON 系列运算库,改进中断函数,充许...

[复制链接]
3375|22
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
laoxu|  楼主 | 2016-7-11 06:08 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
序:
ChipON 系列 MCU,有着很有特色的内核,指令集 初看 像PIC,命名上看似有 51的 R0~R7寄存器,实际上确是个 精简的 类AVR。
总体上看,指令执行速度执行效率,要比那个号称世界第一的STC,要快几倍,芯片性价比高,哥看着喜欢,故有了下面“玩”的故事。

从用 ChipON---IDE编译器 开始,到逐渐熟悉上手,总体感觉,资料不全问题多多,很多时候要摸着石头过河。

从 ChipON 公司 买了一个调试器,要了点样片 搭个板子,正式编程开始玩,先用C编程,ROM消耗很快,一会儿 full 了,也挺消耗 RAM 的(局部变量不回收),总之,玩的不爽。

用 ASM 编程,可以编的很精练,玩什么呢?就从 C编译器入手吧,精简最不爽的,特耗 ROM 的运算库,充许 在中断中,任意使用 加减乘除数**算(包括浮点运算),指针操作,带参数函数的调用。


打赏榜单

21ic小能手 打赏了 3.00 元 2016-07-11

沙发
laoxu|  楼主 | 2016-7-11 06:22 | 只看该作者
本帖最后由 laoxu 于 2016-7-11 06:27 编辑

下面的程序,针对 V1核优化,V2核由于多了几条指令,带硬件乘除器 以及ROM需要分页处理,需另行优化。


调用 ChipON 官方 定点运算库,Release 模式 O2优化级 编译。





调用 ChipON 官方 定点运算库,Release 模式 O3优化级 编译。





哥精简的 定点运算库,针对 V1核优化,Release 模式 O2优化级 编译。



使用特权

评论回复
板凳
laoxu|  楼主 | 2016-7-11 06:31 | 只看该作者
调用 ChipON 官方 浮点运算库,Release 模式 O2优化级 编译。





调用 ChipON 官方 浮点运算库,Release 模式 O3优化级 编译。






哥精简的 浮点运算库,针对 V1核优化,Release 模式 O2优化级 编译。



使用特权

评论回复
地板
laoxu|  楼主 | 2016-7-11 06:38 | 只看该作者
调用 ChipON 官方 浮点数比较子程序库,Release 模式 O2优化级 编译。





调用 ChipON 官方 浮点数比较子程序库,Release 模式 O3优化级 编译。






哥精简的 浮点数比较子程序库,针对 V1核优化,Release 模式 O2优化级 编译。





下面增加了 两个 官方目前不支持的 浮点数比较子程序,再次编译。



使用特权

评论回复
5
laoxu|  楼主 | 2016-7-11 08:15 | 只看该作者
程序构架说明:
ChipON 系列 MCU,有着很有特色的 类拟 51的 R0~R7寄存器,有着 类拟 AVR 的多累加器功能。
可惜,ChipON---IDE编译器 将里面的 R2~R5寄存器,用于中断保护,白白浪费了这大好的资源。
为尽量保持与 原 ChipON---IDE编译器 兼容,本程序只使用余下的 4个寄存器 R0,R1,R6,R7 。
原 ChipON---IDE编译器 ,库函数中所用到的 局部变量,全部使用 RAM 直接寻址,并且不回收,从而产生了在 中断 中,绝对不充许用户调用 库函数 的严重后果。影响了用户体验。
本 程序构架 中,库函数中所用到的 局部变量,全部采用模拟软栈保存,并且使用 RAM 间接寻址,函数返回时及时回收,在 中断 中,通过对 模拟软栈 的切换,充许 用户调用 库函数,及调用 带参函数,与普通 C 语言使用无异。
尽管 在库函数中,所用到的 局部变量,全部使用 RAM 间接寻址,由于 ChipON 系列 MCU,间接寻址功能不强,大大增加了 程序长度,但通过汇编级优化,实际长度 只有 原官方 RAM 直接寻址 库程序 的 1/5 ,相比之下,还算短小精练,是可以接受的。

使用特权

评论回复
6
laoxu|  楼主 | 2016-7-11 08:29 | 只看该作者
库函数 局部变量 RAM 占用:
在 ChipON---IDE编译器 函数传递参数变量的 STK00~STK12 同一页中,增加 8字节 的模拟软栈(占用软栈最多的浮点乘除法,只占用 6字节),多出来的 2字节,考虑到在以后增加的浮点超越函数中使用,如 e,log,sin 等等。
如在 中断中 使用 库函数,每级中断 需增加 8字节 的专用模拟软栈,ChipON MCU 有 高低 2级中断, 因此,最多需增加 24字节 的模拟软栈,外加 1字节的 模拟软栈 切换指针。
sharebank .udata
;    .banksel  STK00
INT_BANK      .res  24   ; LEN*(INT_MODE+1)
Pointer_BANK  .res  1

使用特权

评论回复
7
yanyanyan168| | 2016-7-11 09:52 | 只看该作者
对汇编不熟悉,一直用C开发。功夫可以C编译器上用的心吗。

使用特权

评论回复
8
Jim12345| | 2016-7-11 14:35 | 只看该作者
laoxu 发表于 2016-7-11 08:29
库函数 局部变量 RAM 占用:
在 ChipON---IDE编译器 函数传递参数变量的 STK00~STK12 同一页中,增加 8字节  ...

使用特权

评论回复
9
cgd| | 2016-7-11 14:56 | 只看该作者
顶!

使用特权

评论回复
10
laoxu|  楼主 | 2016-7-12 08:13 | 只看该作者
扫了一下 ChipON---IDE 剩下的 LIB 。
1) 在指针类操作,有着过多的 指针读内存 程序,比如 读 3字节 ROM 和 RAM , 不知何用? 故优化较少,仅作了部分调整优化,保留原 所有 库程序。
2) 浮点数转定点数 及 定点数转浮点数 类操作,进行了大幅度的优化。
3) 利用 V2核 的硬件乘除器,进行的 乘除法操作库,我粗扫了一下,可进行了大幅度的优化,不过 V1核用不上, 暂时未动。

使用特权

评论回复
11
laoxu|  楼主 | 2016-7-13 08:10 | 只看该作者
浮点数 转换成 整数

fs2slong, fs2ulong, fs2sint, fs2uint, fs2schar, fs2uchar(有符号,无符号), 没必要分开,合并成一个程序。对浮点数先去掉符号,再 转换成 ulong 型,如是负数则求补码,最后根据 long,int,char 类型,输出返回结果。



整数 转换成 浮点数
分有符号 和 无符号类型:

对有符号数,如是负数则求补码,再转换成浮点数,回填符号位,输出返回结果。slong2fs, sint2fs, schar2fs 合并成一个程序。

对无符号数,直接转换成浮点数,输出返回结果。ulong2fs, uint2fs, uchar2fs 合并成一个程序。

使用特权

评论回复
12
laoxu|  楼主 | 2016-7-13 08:24 | 只看该作者
本帖最后由 laoxu 于 2016-7-13 13:00 编辑

扩充库编译 使用说明:

本库全部用汇编书写,并进行了优化处理,执行效率高,支持在中断中,任意使用 加减乘除数学 运算(包括浮点运算),指针操作,带参数函数的调用。

本库是为 ChipON MCU 定向编写的,属 V1核专用,无版权声明,可根据需要任意修改。

希望官方能给予正式测试,加入下一版本的  ChipON---IDE编译器,方便 用户使用 及 ChipON MCU 的推广。

程序编译后,将  ChipON---IDE编译器 \ChipONCC\bin目录下的 库文件 libkf8.lib先做备份,然后 和 库维护文件 kf8lib 以及 批处理文件 lib_new ,一同拷贝到 需 建库的 O文件 同一目录中,执行 lib_new,会自动生成一个新的一个 libkf8.lib 文件,再将她拷贝到 \ChipONCC\bin目录下 即可。

使用特权

评论回复
13
laoxu|  楼主 | 2016-7-13 08:58 | 只看该作者
扩充库在 ChipON C语言中的使用:

C语言文本 标准格式如下:



加入了 头文件COMMON.h 和 模拟栈初始化代码,如需中断中使用 加减乘除数学 运算(包括浮点运算),指针操作,带参数函数的调用,还需加入下面 2条 模拟压栈,退栈指令。

使用特权

评论回复
14
laoxu|  楼主 | 2016-7-13 09:18 | 只看该作者
头文件COMMON.h 说明:

#define  INT_MODE  0    // KF8FXXX/KF8S系列单级中断置0, 其他系列两级中断置1

#if  INT_MODE
char   __at(0x80)   VAR_SP;          // 模拟栈切换指针
char   __at(0x81)   SIM_STACK[24];   // 模拟栈,8*(中断级数+1)
char   __at(0x99)   I0_STACK[8];     // 4(R6,STK00~STK02)或8(R6,STK00~STK06)
char   __at(0xa1)   I1_STACK[8];     // 4(R6,STK00~STK02)或8(R6,STK00~STK06)
#else
char   __at(0x80)   VAR_SP;          // 模拟栈切换指针
char   __at(0x81)   SIM_STACK[16];   // 模拟栈,8*(中断级数+1)
char   __at(0x91)   I0_STACK[9];     // 5(R6,R7,STK00~STK02)或9(R6,R7,STK00~STK06)
#endif

扩充库用到的上述全局变量,最好以at指定地址方式命名,以保证 编译器生成的代码,和 STK00~STK12 在同一页中,这样程序运行速度最快。
用户可自行查看生成的 LST文件,必须强调,本扩充库的编写,已强制指定 VAR_SP, SIM_STACK 和 STK00~STK12 在同一页中,  如果 VAR_SP, SIM_STACK 不和 STK00~STK12 的同一页中,将不能保证正确的运行结果,切记!!!
用户可适当修改 at 指定值,以达到上述目的,当然,希望官方下一版本的 ChipON---IDE编译器,如自动分配上述变量。

使用特权

评论回复
15
laoxu|  楼主 | 2016-7-14 08:32 | 只看该作者
本帖最后由 laoxu 于 2016-7-20 08:05 编辑

上传测试库,里面有两个工程,一个是 LIB 工程,包含所有的建库函数 ASM源代码,可根据需要,任意修改。我是在其目录下,用汇编调用仿真调试,检查其正确性。

另一个是 TEST工程,用C编写,供综合测试LIB用,不过我没能调试(主要原因是DEBUG时,所有的变量的不显示,没法调试!!!),请官方帮忙看一下,到底是什么原因?

注:TEST工程编译前,必须先将  ChipON---IDE编译器 \ChipONCC\bin目录下的 库文件 libkf8.lib做备份,将本 LIB 工程中,生成的 libkf8.lib 文件,拷贝到 \ChipONCC\bin目录下 使用。


否则,由于原库的优化级别太低,编译的程序, ROM,RAM都超出芯片有效范围,引起无法编译通过。



使用特权

评论回复
16
laoxu|  楼主 | 2016-7-19 08:46 | 只看该作者
在调试时,单步要死机,感觉是调试器占用堆栈溢出。设置硬断点能通过。

在调试中,查看相关变量很吃力,因为编译器对所用到的变量识别不全,特别是浮点数和指针类,通过标签自定义吧,又只能显示 BYTE 类型,并且只能打开一个标签窗口,特别不爽,加上没有反汇编窗口,调试查错效率特差。

使用特权

评论回复
17
laoxu|  楼主 | 2016-7-19 23:25 | 只看该作者


通过指定变量地址,然后通过 RAM显示的 HEX值,手工换算成 浮点数,对比理论计算数据,验证运算结果~~~

吐槽一下,仿佛回到了上世纪那遥远的年代,依靠手工查表,将汇编转换成机器码,键盘输入的开发年代。

发现有两个地方有笔误,一个是RAM指针切换,另一个是浮点除法,已修改。

workspace.rar (1.59 MB)



使用特权

评论回复
18
yifengbest| | 2016-8-31 17:02 | 只看该作者
“玩”的境界很高啊  赞

使用特权

评论回复
19
416356084| | 2016-9-6 16:02 | 只看该作者
没用过这个系列的单片机

使用特权

评论回复
20
hljjxzhla| | 2016-9-13 09:01 | 只看该作者
即将使用chipon的8位单片机了,感觉资料少,不太会用啊

使用特权

评论回复
发新帖 本帖赏金 3.00元(功能说明)我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

146

主题

2274

帖子

221

粉丝