|
习惯了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
|