硬汉嵌入式论坛

 找回密码
 立即注册
查看: 40531|回复: 26
收起左侧

[emWin] 【简易教程】用MDK5.0建立一个CMSIS-RTOS RTX+emWin的工程(用MDK自带的Manage Run

[复制链接]

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
107101
QQ
发表于 2013-10-13 10:51:01 | 显示全部楼层 |阅读模式
说明:现在的MDK5.0版本还不完善,有一些小BUG,不建议大家用,不过有一些同学
          想尝试一下,此教程因此而生, 关于CMISIS-RTOS和RTX的关系,看这个帖子
          http://www.armbbs.cn/forum.php?mod=viewthread&tid=1671
现在我发现了两个小BUG,不知道大家的电脑有没有这个BUG,现在我的电脑系统是XP SP3
第一个:在Add Group的时候存在BUG,添加了一个之后,就无法再添加了,贴一个截图。
1.png

这个BUG让人在建立工程的时候非常的难受,所以我这里提前先把必要的文件用MDK4.54
建立好然后添加RTX和emWin的时候用Manage Run-Time Environment。
第二个:不管你改了那里,每次都是全编译,泪奔。
有几个好处也是很明显的,一个是编译速度快了,而且下载速度也飞快。
这个bug都不用担心,以MDK的更新速度,很快就会更正过来,好了,现在开始教程。
添加RTX
第一步:我先用MDK4.54建立如下的一个工程,也就是我给armfly-v5开发板做的STemWin5.20裸机
              例程。http://www.armbbs.cn/forum.php?mod=viewthread&tid=1826
2.png

现在用MDK5.0编译结果如下
3.png

第二步:添加RTX, 添加方法如下
4.png

然后在此用MDK5.0编译,结果如下,会出现一堆的这个错误
5.png

不要担心,在这里把CMSIS的Core也添加上,在此编译结果如下
6.png

7.png

还是有个错误,这个好办,把bsp_timer文件里面的这个注释掉就好了
void SysTick_Handler(void)
{
    SysTick_ISR();
}
再次编译已经没有错误了,到这里RTX已经添加上去了,这里我就不提供
RTX的使用方法了,因为这个已经被ARM重新封装了,函数名字都换了。
8.png

添加emWin
方法和上面的RTX是一样的,这里就不多说了,直接添加,将我做好的CMSIS-RTOS+emWin
的例子附件上面,有什么问题对比一下就行,实际在armfly-v5开发板上面运行没有问题
CMSIS-RTOS的函数名字相对于RTX什么都换了,我参考了一些提供的简单工程也简单的做了一个。
MDK5.0建立教程简易版.zip (14.6 MB, 下载次数: 12709)
工程简单的说明:建立了三个任务。
1.  内核初始化

int main (void)
{
  bsp_Init();
  tid_emWin  = osThreadCreate(osThread(emWin) , NULL);
  tid_emWinTouch = osThreadCreate(osThread(emWinTouch), NULL);
                      osThreadCreate(osThread(Led), NULL);
  osDelay(osWaitForever);
  while(1);
}
2.  任务一:LED
void Led (void const *argument) {
    for (;;)    
    {
        bsp_LedToggle(1);        
        bsp_LedToggle(2);
        bsp_LedToggle(3);        
        bsp_LedToggle(4);
        osDelay(100);  /* wait for 20ms   */       
     }
}
任务二:emWin的触摸任务
extern __IO uint8_t s_ucRA8875BusyNow;
void emWinTouch (void const *argument)
{
    while (1)
    {
        if (g_ChipID == IC_8875)
        {
            if(s_ucRA8875BusyNow == 0)
            {
                GUI_TOUCH_Exec();   
            }
        }
        /* XPT2046 */
        else
        {
            GUI_TOUCH_Exec();   
        }
         osDelay(20);  /* wait for 20ms   */
    }
}
任务三:emWin任务
void emWin (void const *argument) {
    for (;;)    
    {
        MainTask();   
     }
}
看看上面,是不是和RTX不一样了,不过想使用RTX也是可以的,安装包里面还是有RTX的源码,
直接添加源码使用就可以的。
9.png
回复

使用道具 举报

2

主题

135

回帖

2

积分

初级会员

积分
2
发表于 2013-10-13 10:54:37 | 显示全部楼层
[s:151] [s:151] [s:151] [s:150] [s:150] [s:150]
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
107101
QQ
 楼主| 发表于 2013-10-13 11:07:15 | 显示全部楼层

回 northtiger 的帖子

northtiger:[s:151] [s:151] [s:151] [s:150] [s:150] [s:150]  (2013-10-13 10:54) 
我还么写完呢。。。
回复

使用道具 举报

36

主题

2040

回帖

2148

积分

至尊会员

积分
2148
发表于 2013-10-13 12:19:28 | 显示全部楼层
来的很及时
Ever tried. Ever failed. No matter. Try Again. Fail again. Fail better.
回复

使用道具 举报

23

主题

1406

回帖

1475

积分

至尊会员

积分
1475
发表于 2013-10-13 12:19:49 | 显示全部楼层
[s:151] [s:151] [s:151]
代码不规范,亲人两行泪!
回复

使用道具 举报

2

主题

27

回帖

2

积分

新手上路

积分
2
发表于 2013-10-13 12:54:44 | 显示全部楼层
[s:149]
回复

使用道具 举报

16

主题

27

回帖

75

积分

初级会员

积分
75
发表于 2013-10-13 13:51:46 | 显示全部楼层
第一个BUG确实有,只要建立的文件夹下的c文件添加或删除,文件名就自动更改回默认的了。。第二个BUG目前没遇到。改动了文件,没有全编译。
回复

使用道具 举报

16

主题

27

回帖

75

积分

初级会员

积分
75
发表于 2013-10-13 14:00:54 | 显示全部楼层
第一个BUG确实有,只要建立的文件夹下的c文件添加或删除,文件名就自动更改回默认的了。。第二个BUG目前没遇到。改动了文件,没有全编译。
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
107101
QQ
 楼主| 发表于 2013-10-14 10:31:30 | 显示全部楼层

回 weiz1989 的帖子

weiz1989:第一个BUG确实有,只要建立的文件夹下的c文件添加或删除,文件名就自动更改回默认的了。。第二个BUG目前没遇到。改动了文件,没有全编译。 (2013-10-13 14:00) 
今天又试了试,好像没有第二个问题了。
回复

使用道具 举报

16

主题

27

回帖

75

积分

初级会员

积分
75
发表于 2013-10-14 14:47:43 | 显示全部楼层

回 eric2013 的帖子

eric2013:今天又试了试,好像没有第二个问题了。 (2013-10-14 10:31) 
嗯,RTX的OS初始化和开始函数,貌似不调用,只要把任务建立 就可以直接运行了?
osKernelInitialize ();
osKernelStart ();  
求解这两个函数有毛用
回复

使用道具 举报

16

主题

27

回帖

75

积分

初级会员

积分
75
发表于 2013-10-14 14:52:17 | 显示全部楼层

回 eric2013 的帖子

eric2013:今天又试了试,好像没有第二个问题了。 (2013-10-14 10:31) 
    osThreadDef(Task1_Led, osPriorityNormal, 1, 0);
    osThreadDef(Task2_Led, osPriorityNormal, 1, 250);
这个函数的最后一个参数0  是不是代表默认设置的堆栈,下面改成250就运行不了了。如何自定义堆栈大小呢。。
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
107101
QQ
 楼主| 发表于 2013-10-14 14:53:34 | 显示全部楼层

回 weiz1989 的帖子

weiz1989:嗯,RTX的OS初始化和开始函数,貌似不调用,只要把任务建立 就可以直接运行了?
osKernelInitialize ();
osKernelStart ();  
求解这两个函数有毛用 (2013-10-14 14:47) 
恩,这个我还么有研究,后面有时间了看看cmsis-rtos,
rtx需要初始化的。重新封装以后貌似其它函数里面会执行,你也可以
看看源码,看看就知道了。
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
107101
QQ
 楼主| 发表于 2013-10-14 14:56:38 | 显示全部楼层

回 weiz1989 的帖子

weiz1989:    osThreadDef(Task1_Led, osPriorityNormal, 1, 0);
    osThreadDef(Task2_Led, osPriorityNormal, 1, 250);
这个函数的最后一个参数0  是不是代表默认设置的堆栈,下面改成250就运行不了了。如何自定义堆栈大小呢。。 (2013-10-14 14:52) 
我还没有研究过,最近没时间研究CMSIS-RTOS了,后面有时间了我再看看吧。
RTX的话有专门的使用用户堆栈的函数,和使用系统的不同。
回复

使用道具 举报

1

主题

8

回帖

11

积分

新手上路

积分
11
发表于 2014-3-3 09:20:16 | 显示全部楼层
按此方法建立的工程可以运行,但是调用GUI_delay失败,会进入死循环,运行emwin的guidemo会一直停留在启动画面,请楼主验证是否属实
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
107101
QQ
 楼主| 发表于 2014-3-3 09:25:11 | 显示全部楼层

回 nlcxwqaz 的帖子

nlcxwqaz:按此方法建立的工程可以运行,但是调用GUI_delay失败,会进入死循环,运行emwin的guidemo会一直停留在启动画面,请楼主验证是否属实 (2014-03-03 09:20) 
直接使用我建立好的工程试试
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
107101
QQ
 楼主| 发表于 2014-3-3 09:25:52 | 显示全部楼层

回 nlcxwqaz 的帖子

nlcxwqaz:按此方法建立的工程可以运行,但是调用GUI_delay失败,会进入死循环,运行emwin的guidemo会一直停留在启动画面,请楼主验证是否属实 (2014-03-03 09:20) 
这个帖子时间有点长了。
回复

使用道具 举报

5

主题

10

回帖

25

积分

新手上路

积分
25
发表于 2014-3-31 12:00:04 | 显示全部楼层
[s:151] 不错的资料,还在想KEIL自带的RTOS编译怎么不通过
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
107101
QQ
 楼主| 发表于 2014-3-31 12:16:33 | 显示全部楼层

回 君莫笑 的帖子

君莫笑:[s:151] 不错的资料,还在想KEIL自带的RTOS编译怎么不通过 (2014-03-31 12:00) 
这个只能在KEIL5.0版本上面用,后来新升级的版本就不行了,版本一直在更新,这个东西也一直在变
回复

使用道具 举报

14

主题

78

回帖

120

积分

初级会员

积分
120
发表于 2014-4-15 14:45:20 | 显示全部楼层
我运行V5-407_RTX实验_RTX4.7 + STemWin5.22,如果不选Use MicroLIB,LCD就没有显示。
是否正常?  我用MDK4.72。
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
107101
QQ
 楼主| 发表于 2014-4-16 11:06:03 | 显示全部楼层

回 mcza30 的帖子

mcza30:我运行V5-407_RTX实验_RTX4.7 + STemWin5.22,如果不选Use MicroLIB,LCD就没有显示。
是否正常?  我用MDK4.72。
 (2014-04-15 14:45) 
得选上
回复

使用道具 举报

14

主题

78

回帖

120

积分

初级会员

积分
120
发表于 2014-4-16 21:48:44 | 显示全部楼层
知道了,谢谢eric2013 。
回复

使用道具 举报

4

主题

29

回帖

41

积分

新手上路

积分
41
发表于 2014-10-1 10:21:21 | 显示全部楼层

回 eric2013 的帖子


For compatibility reasons, call osKernelInitialize() and osKernelStart() in your main function. This is not required in the current releases of CMSIS-RTOS RTX, but can cause malfunction in future releases or when using a different CMSIS-RTOS compliant RTOS.
回复

使用道具 举报

0

主题

1

回帖

1

积分

新手上路

积分
1
QQ
发表于 2015-8-7 00:24:44 | 显示全部楼层
第二个Bug:不管你改了那里,每次都是全编译——我这里的V5.15版本也存在。
回复

使用道具 举报

5

主题

69

回帖

5

积分

初级会员

积分
5
发表于 2015-8-7 15:58:42 | 显示全部楼层
第一个BUG用工程管理器就行了,还遇到过一个在工程目录上点击不能更改名字的bug,只有工程管理器里才能修改
回复

使用道具 举报

10

主题

20

回帖

50

积分

初级会员

积分
50
QQ
发表于 2015-9-24 14:18:25 | 显示全部楼层
请问一下,怎么停止CMSIS-RTOS RTX的调度器运行?好像没发现这个函数?
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
107101
QQ
 楼主| 发表于 2015-9-24 17:16:29 | 显示全部楼层

回 yiminglei 的帖子

yiminglei:请问一下,怎么停止CMSIS-RTOS RTX的调度器运行?好像没发现这个函数? (2015-09-24 14:18) 
貌似没有。
回复

使用道具 举报

0

主题

1

回帖

1

积分

新手上路

积分
1
发表于 2017-11-21 11:40:56 | 显示全部楼层
[s:151]
回复

使用道具 举报

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

本版积分规则

QQ|小黑屋|Archiver|手机版|硬汉嵌入式论坛

GMT+8, 2024-5-18 06:45 , Processed in 0.335779 second(s), 28 queries .

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2023, Tencent Cloud.

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