迪文科技论坛

 找回密码
 立即注册
搜索
查看: 18|回复: 0

【分享】DWIN HMI & OS开发技巧

[复制链接]

7

主题

82

回帖

739

积分

高级会员

Rank: 4

积分
739
发表于 前天 14:14 | 显示全部楼层 |阅读模式
       习惯了keil C开发,DGUS_V7.647开发模式非常难受,所有变量都要手工安排,而且变量地址容易出错,重复,每次修改都需人工校对,工作量巨大。幸好迪文出来了一款全新的DWIN HMI软件,SP,VP变量自动生成,并生成宏定义传递给keil,通过这几天实际总结出一套好的方法分析出来。
       一般keil开发,会有很多几百个甚至上千个变量,对于这么庞大数量的变量,往往会整理成面向对象的结构体,比如我设计了一款电源。那么电源里面按名称分有电压值,电流值,功率值,按行为分有采样值,设定值,限制值,矫正值,用户快捷值,还有输出状态,按钮名字,按钮行为等等。 那么问题来了,这么多变量在UI DGUS软件里面都是属于VP变量,而且在DGUS里面全是独立个体,互相之间没有关联,数量多且凌乱,没办法在DGUS软件里面按对象定义成结构体。好在DWIN HMI有SP描述指针宏定义名,生成后在c51header文件夹内。方法来了,在DWIN HMI放置好控件,并定义好SP宏名,传递到Keil, 在keil里面把结构化的VP地址+DUGS变量起始地址传递给DUGS SP指向的VP指针, 经过这么一一对应后,UI核的控件和keil里面对象内容完全分开了,这样我只关心Keil下对象操作,比如电压采样值,电流采样值更新后,把整个结构体写到UI核可以了,无需再关心控件SP和VP的对应了.

        uint16_t vpAddr = (uint16_t*)&buck.voltage.set - (uint16_t*)&buck + vpBuck_Parameter;        //buck是一个结构体,        vpBuck_Parameter是传递给UI的VP起始地址。获取到buck.voltage.set变量偏移地址+VP起始地址。
        Write_Dgus_Halfword(sp1Data_Vset, vpAddr);      //sp1Data_Vset是定义在Dugs UI里面的数据控件SP指针名。 意思把buck.voltage.set 的内容地址和sp1Data_Vset SP指针指向的VP对应起来。
        ......  //中间代码对buck结构体操作。
       Write_Dgus((uint8_t*)&buck, vpBuck_Parameter, sizeof(buck));        //最后把整个结构体写到UI里面,全部内容一起更新。

       另外write_Dgus,Read_Dgus函数也做了优化,很多工程师没去考虑C转成汇编后的代码量。C51 data区变量操作只要一条指令,而在xdata区要多条指令这速度要慢很多。Dgus变量传递为底层接口,和UI通讯是最频繁的。这几个函数执行效率直接影响到整个代码效率。具体方法:void Write_Dgus(uint8_t *pBuf8, uint16_t addr, uint16_t datLen); 带进来的*pBuf8 传递给定义在data区指针变量 *pdat。datLen也传递给定义在data区数据变量len16,  并用union变量来做间接二次数据传递到DATA0~DATA3,在Dugs写入时利于等待时间去做buf.lword = *(uint32_t*)pdat8,等待写完成后立即 DATA3 = buf.byte[0]; DATA2 = buf.byte[1]; DATA1 = buf.byte[2]; DATA0 = buf.byte[3]; 这只要4条指令就完成32位数据传递。如果用DATA3 = *pBuf8++; 来做需要36*4条指令才能完成32位数据传递。其中速度慢了近100倍( xdata变量部分汇编指令是需要3~4个周期才能完成的)。

代码中还增加了文本控件和数字控件还增加了闪烁函数,这对于变量输入指示会比较有用。

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

x
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|Archiver|手机版|小黑屋|迪文科技论坛 ( 京ICP备05033781号-1 )

GMT+8, 2025-1-30 14:06 , Processed in 0.063486 second(s), 23 queries .

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表