硬汉嵌入式论坛

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

RTX任务增加删除的问题(问题已解决)

[复制链接]

3

主题

18

回帖

3

积分

新手上路

积分
3
发表于 2016-5-9 14:11:42 | 显示全部楼层 |阅读模式
诸位大虾好,
本人ARM菜鸟一只,最近用ST公司的F429探索板学习Eric老大关于RTX的教程,进行到task的添加与删除这一块时遇到一个问题:
编译通过,并且下载程序后驱动两个任务工作,分别是LED3和LED4各自点亮熄灭的任务,当按下用户按键时,如果任务2(点亮熄灭LED4)句柄存在的话则删除该任务,如果不存在则创建该任务。
下载程序上电复位后,LED3和LED4各自点亮熄灭,通过debug模式可以看到两个任务正常进行,但当按下用户按键后,进行到if(HandleTask2 != NULL)时,软件的判定永远是“否”。我通过watch调试窗口监控几个任务的句柄,发现在执行AppTaskStart函数后,三个任务的句柄value均为非零值,可如果暂停到if(HandleTask2 != NULL)这句时,用鼠标指向HandleTask2在编辑器中的位置时,鼠标指针旁弹出的值显示为了0x00000000,可此时watch监控窗口中对应的句柄value仍然是一个非零值。实在是想不通哪里有什么问题,是不是哪里没有注意到。还请各位大侠指点迷津。
我用的是uVersion5.18a。

Untitled.jpg


感谢各位帮助!

EDIT: 问题已经解决,如回帖中描述,我将几个任务分别写入task1.c/.h,task2.c/.h,task3.c/.h中,为了能让task3种的任务可以删除添加task2种的任务句柄,我将任务2句柄的定义“OS_TID HandleTask2"放在task2.h中,同理设置task1和task3的句柄,但编译的时候发现不能通过会报错”multiple definitions"。我发现是这些任务句柄的定义由于头文件的彼此调用而造成该错误,后来在声明前加入"static"解决了编译错误,但出现了主帖中的问题。
今天将这个声明改为比较规范的样式:

#ifdef task2_c
    OS_TID HandleTask2;
#else
    extern OS_TID HandleTask2;
#endif
编译通过,且程序正常运行了。


个人对C了解的还是不够深入,大虾能否解释一下之前的声明为什么会造成编译通过但实际运行时总认为存在的任务句柄不存在呢?
再编辑:似乎明白了,就算在头文件中定义static OS_TID HandleTask2;每个C文件调用此头文件时,都相当于各自声明一个名字相同的任务句柄变量,根本不是全局变量,彼此之间无法相互调用。。。。。还是我太菜了。。。不过在别的单片机和别的编译起了这样定义就可以作为全局变量而存在了。
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
107101
QQ
发表于 2016-5-9 14:14:27 | 显示全部楼层
uVersion5.18a里面的RTX我没有用过,MDK5.XX里面的已经都换了,帮顶,
我写的RTX教程固定为MDK4.74版本。
回复

使用道具 举报

3

主题

18

回帖

3

积分

新手上路

积分
3
 楼主| 发表于 2016-5-9 14:20:03 | 显示全部楼层
感谢老大及时回复。
主要是debug模式下给出的value和在旁边编辑器中的value都不一样,很困惑。如果任务句柄没有创建成功的话,那LED4也不会出现闪烁的动作...可这个例子也没什么太多复杂的东西,所以真不知道哪里出了问题。
回复

使用道具 举报

3

主题

18

回帖

3

积分

新手上路

积分
3
 楼主| 发表于 2016-5-9 14:32:22 | 显示全部楼层

回 eric2013 的帖子

eric2013:uVersion5.18a里面的RTX我没有用过,MDK5.XX里面的已经都换了,帮顶,
我写的RTX教程固定为MDK4.74版本。 (2016-05-09 14:14) 
麻烦老大再看一下主贴里附上的图片,不知道能有什么线索。谢谢
回复

使用道具 举报

3

主题

18

回帖

3

积分

新手上路

积分
3
 楼主| 发表于 2016-5-9 14:42:29 | 显示全部楼层
图片中HandlerTask2的Value非零,这个是我从创建任务函数的那个.c文件中拖到watch中的。如果我把图片中编辑栏中的HandlerTask2拖到watch中,则会又有一个HandlerTask2但是Value确是零。
在声明HandlerTask2时,我是创建了task1.c/.h,task2.c/.h以及task3.c/h,并在task2.h中声明了static OS_TID HandleTask2; 然后其他的文件引用此头文件调用对应的task句柄。不知道这样声明有无不妥。因为Eric的范例都是在一个main.c中,我想以后做的项目不太可能把所有的任务都写在一个文件中,故而这样布局。
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-5-18 08:07 , Processed in 0.174923 second(s), 28 queries .

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2023, Tencent Cloud.

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