“玩”的故事----精简 ChipON 系列运算库,改进中断函数,充许...
序:ChipON 系列 MCU,有着很有特色的内核,指令集 初看 像PIC,命名上看似有 51的 R0~R7寄存器,实际上确是个 精简的 类AVR。
总体上看,指令执行速度执行效率,要比那个号称世界第一的STC,要快几倍,芯片性价比高,哥看着喜欢,故有了下面“玩”的故事。
从用 ChipON---IDE编译器 开始,到逐渐熟悉上手,总体感觉,资料不全问题多多,很多时候要摸着石头过河。
从 ChipON 公司 买了一个调试器,要了点样片 搭个板子,正式编程开始玩,先用C编程,ROM消耗很快,一会儿 full 了,也挺消耗 RAM 的(局部变量不回收),总之,玩的不爽。
用 ASM 编程,可以编的很精练,玩什么呢?就从 C编译器入手吧,精简最不爽的,特耗 ROM 的运算库,充许 在中断中,任意使用 加减乘除数**算(包括浮点运算),指针操作,带参数函数的调用。
本帖最后由 laoxu 于 2016-7-11 06:27 编辑
下面的程序,针对 V1核优化,V2核由于多了几条指令,带硬件乘除器 以及ROM需要分页处理,需另行优化。
调用 ChipON 官方 定点运算库,Release 模式 O2优化级 编译。
调用 ChipON 官方 定点运算库,Release 模式 O3优化级 编译。
哥精简的 定点运算库,针对 V1核优化,Release 模式 O2优化级 编译。
调用 ChipON 官方 浮点运算库,Release 模式 O2优化级 编译。
调用 ChipON 官方 浮点运算库,Release 模式 O3优化级 编译。
哥精简的 浮点运算库,针对 V1核优化,Release 模式 O2优化级 编译。
调用 ChipON 官方 浮点数比较子程序库,Release 模式 O2优化级 编译。
调用 ChipON 官方 浮点数比较子程序库,Release 模式 O3优化级 编译。
哥精简的 浮点数比较子程序库,针对 V1核优化,Release 模式 O2优化级 编译。
下面增加了 两个 官方目前不支持的 浮点数比较子程序,再次编译。
程序构架说明:
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 ,相比之下,还算短小精练,是可以接受的。 库函数 局部变量 RAM 占用:
在 ChipON---IDE编译器 函数传递参数变量的 STK00~STK12 同一页中,增加 8字节 的模拟软栈(占用软栈最多的浮点乘除法,只占用 6字节),多出来的 2字节,考虑到在以后增加的浮点超越函数中使用,如 e,log,sin 等等。
如在 中断中 使用 库函数,每级中断 需增加 8字节 的专用模拟软栈,ChipON MCU 有 高低 2级中断, 因此,最多需增加 24字节 的模拟软栈,外加 1字节的 模拟软栈 切换指针。
sharebank .udata
; .bankselSTK00
INT_BANK .res24 ; LEN*(INT_MODE+1)
Pointer_BANK.res1 对汇编不熟悉,一直用C开发。功夫可以C编译器上用的心吗。 laoxu 发表于 2016-7-11 08:29
库函数 局部变量 RAM 占用:
在 ChipON---IDE编译器 函数传递参数变量的 STK00~STK12 同一页中,增加 8字节...
{:victory:}{:victory:}{:victory:}{:victory:}{:victory:} 顶! 扫了一下 ChipON---IDE 剩下的 LIB 。
1) 在指针类操作,有着过多的 指针读内存 程序,比如 读 3字节 ROM 和 RAM , 不知何用? 故优化较少,仅作了部分调整优化,保留原 所有 库程序。
2) 浮点数转定点数 及 定点数转浮点数 类操作,进行了大幅度的优化。
3) 利用 V2核 的硬件乘除器,进行的 乘除法操作库,我粗扫了一下,可进行了大幅度的优化,不过 V1核用不上, 暂时未动。 浮点数 转换成 整数
fs2slong, fs2ulong, fs2sint, fs2uint, fs2schar, fs2uchar(有符号,无符号), 没必要分开,合并成一个程序。对浮点数先去掉符号,再 转换成 ulong 型,如是负数则求补码,最后根据 long,int,char 类型,输出返回结果。
整数 转换成 浮点数
分有符号 和 无符号类型:
对有符号数,如是负数则求补码,再转换成浮点数,回填符号位,输出返回结果。slong2fs, sint2fs, schar2fs 合并成一个程序。
对无符号数,直接转换成浮点数,输出返回结果。ulong2fs, uint2fs, uchar2fs 合并成一个程序。
本帖最后由 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目录下 即可。 扩充库在 ChipON C语言中的使用:
C语言文本 标准格式如下:
加入了 头文件COMMON.h 和 模拟栈初始化代码,如需中断中使用 加减乘除数学 运算(包括浮点运算),指针操作,带参数函数的调用,还需加入下面 2条 模拟压栈,退栈指令。
头文件COMMON.h 说明:
#defineINT_MODE0 // KF8FXXX/KF8S系列单级中断置0, 其他系列两级中断置1
#ifINT_MODE
char __at(0x80) VAR_SP; // 模拟栈切换指针
char __at(0x81) SIM_STACK; // 模拟栈,8*(中断级数+1)
char __at(0x99) I0_STACK; // 4(R6,STK00~STK02)或8(R6,STK00~STK06)
char __at(0xa1) I1_STACK; // 4(R6,STK00~STK02)或8(R6,STK00~STK06)
#else
char __at(0x80) VAR_SP; // 模拟栈切换指针
char __at(0x81) SIM_STACK; // 模拟栈,8*(中断级数+1)
char __at(0x91) I0_STACK; // 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编译器,如自动分配上述变量。
本帖最后由 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都超出芯片有效范围,引起无法编译通过。
在调试时,单步要死机,感觉是调试器占用堆栈溢出。设置硬断点能通过。
在调试中,查看相关变量很吃力,因为编译器对所用到的变量识别不全,特别是浮点数和指针类,通过标签自定义吧,又只能显示 BYTE 类型,并且只能打开一个标签窗口,特别不爽,加上没有反汇编窗口,调试查错效率特差。
通过指定变量地址,然后通过 RAM显示的 HEX值,手工换算成 浮点数,对比理论计算数据,验证运算结果~~~
吐槽一下,仿佛回到了上世纪那遥远的年代,依靠手工查表,将汇编转换成机器码,键盘输入的开发年代。
发现有两个地方有笔误,一个是RAM指针切换,另一个是浮点除法,已修改。
“玩”的境界很高啊赞 没用过这个系列的单片机 即将使用chipon的8位单片机了,感觉资料少,不太会用啊
页:
[1]
2