请选择 进入手机版 | 继续访问电脑版

迪文科技论坛

 找回密码
 立即注册
搜索
热搜: T5L 视频屏 DGUS OS
查看: 1791|回复: 3

什么是迪文C编译器(DWIN C Complier)?

[复制链接]

94

主题

152

帖子

1105

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
1105
发表于 2019-5-22 10:50:38 | 显示全部楼层 |阅读模式
1. 何为C编译器?
DWIN C Complier是基于T5 CPU 开发的一款C语言编译器程序。编译又扮演一个什么角色呢?简单来讲,编译器是将“高级语言”翻译为“低级语言”的程序,其工作流程为:源代码 (source code) → 预处理器 (preprocessor) → 编译器 (compiler) → 目标代码 (object code) → 链接器(Linker) → 可执行程序 (executables)。

迪文屏二次开发主要用到的是DWIN OS Builder,也就是汇编语言开发(低级语言),大大提升产品开发的难度。在实际项目开发中,DWIN C Complier的效率提升了30%-40%。举个例子,对于一些极端的项目,使用DWIN OS Builder进行开发需要2-3天;而使用C 语言进行开发可能2个小时就可以完成。


图1:DWIN C Complier主界面


2. 使用说明
2.1 资源介绍

a. 全局变量与局部变量共用 1792 字节空间,正在运行时刻的总变量所占空间不能超
过 1792 字节。
b. VP 空间按照芯片提供进行使用。
c. 程序空间为 32K 字节程序代码。

2.2 语法介绍
a. 标准 C 编译器程序语法结构,可以参照网上资源来学习。
注:对于宏定义的使用多语句尽量使用函数进行封装,宏定义每个使用位置都是字
符串的代替不会有代码节省功能。
b. 标准 C 语言库函数此编译器不支持,但是配套迪文产品支持如下列表中的库函数。
库函数放在 00.LIB 与 01.LIB 文件中,请将两个库文件进行烧录。

2.3 编译器介绍与开发流程
a. 编译器功能介绍
开始程序编写之前请先设置库文件加载到 VP 空间首地址,首地址范围
0X1000-0XF000,必须为偶数 ,预留空间至少 0X1000 字。
第一步,新建或者打开一个工程文件,文件名为**.dwin。如果是新建工程请先对工程
进行保存。在工程头文件项目中添加*.h 文件,在工程源文件项目中添加*.c 文件。
第二步,在程序编写框中编写程序。
第三步,编译程序,根据编译结果进行调整。对未保存的程序进行编译时会先弹出保存窗口提示保存,此时请先进行保存,如果不保存程序将会丢失。
第四步,下载程序,根据需要进行调试。
注:与 OS 相同最终下载到 FLASH 中为实际保存在芯片中的程序。


   图2:图标说明



b. 程序框架与例程
  1. [font=微软雅黑][size=3][color=#000000]/*题目:输入数组,最大的与第一个元素交换,最小的与最后一个元素交换,
  2. 输出数组。*/
  3. int cs_01=0; //全局变量
  4. void move(int array[],int n,int offset); //子函数声明
  5. int main()
  6. {
  7. int arr[20]={1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16};
  8. int i,n,offset;
  9. offset=4;
  10. n=16;
  11. move(arr,n,offset); //滚动数组-子函数调用
  12. write_dgus_vp(0x1280,arr,16); //特殊函数调用
  13. return 1;
  14. }
  15. //滚动数组
  16. void move(int array[],int n,int offset) //子函数
  17. {
  18. int *p,*arr_end; //局部变量
  19. int last;
  20. arr_end=array+n; //数组末尾元素的下一个位置
  21. while(offset) //滚动直到偏移量为 0
  22. {
  23. last=*(arr_end-1);
  24. for(p=arr_end-1;p!=array;--p) //向右滚动一位
  25. *p=*(p-1);
  26. *array=last;
  27. --offset;
  28. cs_01++;
  29. }
  30. }
  31. void Time0_IRQHandler(void) //定时器 0 函数体
  32. {
  33. }
  34. void Time1_IRQHandler(void) //定时器 1 函数体
  35. {
  36. }
  37. void Time2_IRQHandler(void) //定时器 2 函数体
  38. {
  39. }[/color][/size][/font]
复制代码
注:定时器中断入口函数必须要放在程序中,如果没有定时中断则在此处放置空函数即可,如果有中断则先配置相应中断时钟,然后在中断函数中编写程序。并且,中断函数中不可调用特殊函数和包含特殊函数的子函数,也不能运行库函数。调试过程中如果打开中断程序可能频繁进中断程序,根据需要可以酌情屏蔽。


2.4 调试与下载
a.下载
程序编写完毕之后先进行编译,提示编译成功后可以选择将程序下载到芯片 SRAM
中(断点不保存)或者下载到 FLASH 中断电保存。

b. 调试
程序下载完成之后点击 图标,程序进入调试状态。在调试状态可以使用单步调试、单行调试、运行断点等功能,配合编译器右侧的变量显示框可以获取当前状态数据。调试过程中只能在一个文件中打断点,跳转到其他文件执行时之前文件的断点会消失,需要重新补充。


本帖子中包含更多资源

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

x
回复

使用道具 举报

2

主题

13

帖子

59

积分

注册会员

Rank: 2

积分
59
发表于 2019-9-27 18:10:48 | 显示全部楼层
本帖最后由 liuyuchi 于 2019-9-27 19:21 编辑

你好,我在用迪文C编译器时遇到了问题,包括程序运行和调试。(我的屏的型号为DMT80480T050_06WTR,T5 CPU,编译器版本是DWIN C Compiler 1.1.0.5,使用串口2(波特率115200)进行C程序下载、调试),具体下载、运行、调试步骤和问题如下:
我的操作步骤为:
1.用sd卡插卡写入两个内核文件T5OS_V21.BIN和T5UID2_V30.BIN
2.用sd卡插卡写入出场配置文件T5UID2_80480.CFG
3.用sd卡插卡写入两个OS库文件00.LIB和01.LIB
4.用DWIN C Complier编译,用串口下载程序到SRAM和FLASH,库文件加载首地址0xF000(都提示编译/下载完成),程序代码如下:


  1. int main()
  2. {        
  3.    int data_out=999;
  4. while(1)
  5. {
  6.         write_dgus_vp(0x1016, &data_out, 1);
  7.         }

  8.         return 0;
  9. }


  10. void Time0_IRQHandler(void)
  11. {
  12. }
  13. void Time1_IRQHandler(void)
  14. {
  15. }
  16. void Time2_IRQHandler(void)
  17. {
  18. }


复制代码
write_dgus_vp 函数的功能可查看手册说明(见最下方):
这个程序就是用库函数修改地址为0x1016的用户变量,写入的数据为999(0x03E7)。

运行问题如下:
在下载完成后,用串口2指令查看0x1016地址的VP值,发现没有被改变。

调试问题如下:
程序下载完成后点击调试按钮,点击“执行到断点”,发现:提示程序执行位置的黄色小箭头只会停留在程序第一行,而且点一次“执行到断点”后,要处理大概5秒钟(按钮变灰)才回复正常,且程序不会往下执行。

望各位大神解答,谢谢!(文中提到的文件和工程文件在附件里

本帖子中包含更多资源

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

x
回复

使用道具 举报

0

主题

8

帖子

104

积分

注册会员

Rank: 2

积分
104
发表于 2019-9-27 21:03:27 | 显示全部楼层
write_dgus_vp(0x1016, &data_out, 1);  把这行程序改为如下write_dgus_vp(0x1016, (u8*)&data_out, 1);     
回复

使用道具 举报

2

主题

13

帖子

59

积分

注册会员

Rank: 2

积分
59
发表于 2019-9-28 15:01:44 | 显示全部楼层
DWINcx... 发表于 2019-9-27 21:03
write_dgus_vp(0x1016, &data_out, 1);  把这行程序改为如下write_dgus_vp(0x1016, (u8*)&data_out, 1);  ...

你好,我对程序进行了修改,但效果没有改变,如下:

首先,设置库加载首地址为0x6000,下载到SRAM和FLASH完成后都弹出Warnning窗口,提示“The download is complete!”。
下载到flash后屏自动重启。
用迪文串口调试助手查看程序运行效果,发现地址0X1016的VP值并没有改变(串口调试图见最后)。

然后启动调试。 (调试界面见最后)
点击 run to break,永远进不了断点;

关闭调试,重新进入调试,点击 step,程序运行箭头指向 代码第一行“int main()”, 几个调试按钮变灰三秒后恢复正常
再次点击 step, 黄色箭头指向代码第二行“int data_out=999;”
再次点击 step, 黄色按钮又重新指向代码第一行“int main()”
再次点击 step,黄色箭头又指向代码第二行“int data_out=999;”
。。。。。。
如此反复,每次点击完step,黄色箭头都会在代码前两行来回跳转,并且几个调试按钮会变灰三秒钟,随后恢复正常!


(顺便问一下:论坛发帖图片是如何插入文字中的呢?)


本帖子中包含更多资源

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

x
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2019-11-15 22:58 , Processed in 0.022189 second(s), 23 queries .

Powered by Discuz! X3.4

© 2001-2017 Comsenz Inc.

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