目前更新到5.3节,请在http://dl.dbank.com/c02ackpwp6下载5.3节的全部文档
本节源代码请在http://dl.dbank.com/c0t7gmgx2q下载
第5节 任务创建和任务删除钩子函数
上节增加了任务切换钩子功能,打印出任务切换的信息,本节将增加任务创建钩子函数和任务删除钩子函数,分别打印出任务创建和删除的信息。
任务创建和删除钩子函数的原理与任务切换钩子函数的原理是一样的,都是需要定义一个与被挂接函数类型一致的指针型全局变量,使用钩子添加函数将被执行的函数挂接到钩子变量上,不同的是任务创建钩子函数在任务创建后打印,任务删除钩子函数在任务删除后打印。
钩子变量定义如下:
VFHCRT
VFHDLT
VFHCRT和VFHDLT的定义为:
typedef
typedef
被挂接的任务创建函数如下,与任务创建全局变量gvfTaskCreateHook类型一致,它会打印被创建函数的名称及创建的时间。
00071
00072
00073
00074
00075
00076
00077
00078
00079
00080
00081
00082
00083
00084
被挂接的任务删除函数如下,与任务删除全局变量gvfTaskDeleteHook类型一致,它会打印被删除函数的名称及删除的时间。
00104
00105
00106
00107
00108
如果需要使用钩子创建函数则需要在创建任务的函数MDS_TaskCreate里增加钩子函数代码,如下:
00023
00024
00025
00026
……
00094
00095
00096
00097
00098
00099
00100
00101
00102
00103
00104
00105
00106
00107
00108
00109
00110
00111
00112
00113
00026~00094行,代码与上节完全一样。
00096行,只有非系统任务才执行任务创建钩子函数。
00101~00104行,若挂接了任务创建钩子函数则执行。
本节我们需要增加一个删除任务的函数MDS_TaskDelete,用它来删除任务,在删除任务时可以执行挂接的任务删除钩子函数。
任务创建时在任务栈里创建了TCB,TCB中的ready节点和delay节点可能会挂接到ready表和delay表,我们只要将任务从ready表和delay表拆除,操作系统就无法再调度这个任务了,这样就可以删除该任务。删除后任务的任务栈中的数据还是存在的,但由于任务已经无法与ready表和delay表关联,因此这些数据就变成了无效数据。任务删除时,任务所使用的任务栈内存应该也被释放掉,但目前任务栈的内存是由用户申请的而不是由操作系统申请的,因此需要用户自行释放任务栈内存,操作系统不进行管理。以后任务栈由操作系统申请时,MDS_TaskDelete函数才负责释放这部分内存。
00121
00122
00123
00124
00125
00126
00127
00128
00129
00130
00131
00132
00133
00134
00135
00136
00137
00138
00139
00140
00141
00142
00143
00144
00145
00146
00147
00148
00149
00150
00151
00152
00153
00154
00155
00156
00157
00158
00159
00160
00161
00162
00163
00164
00165
00166
00167
00168
00169
00170
00171
00172
00173
00174
00175
00176
00177
00178
00179
00180
00181
00182
00183
00184
00121行,函数有2种返回值,RTN_SUCD代表任务删除成功,RTN_FAIL代表任务删除失败。入口参数pstrTcb是需要被删除的任务的TCB指针。
00130~00133行,入口参数检查,入口参数为空则返回失败。
00136~00139行,入口参数检查,若删除idle任务则返回失败。
00141行,锁中断。下面将操作ready表和delay表,为防止多个任务同时操作这两个表,需要锁中断。
00144行,获取被删除任务的当前任务状态。
00147~00156行,若该任务在ready表中则从ready表删除。
00159~00166行,若该任务在delay表中则从delay表删除。
00168行,调度表操作完成,解锁中断。
00170~00178行,若挂接了任务删除钩子函数则执行该函数。
00181行,任务已经被删除,需要重新调度一次任务。
本节内容较少,主要内容已经介绍完毕。本节仍使用上节的3个功能验证函数,与上节不同的是在8000
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027
00028
00029
00030
00031
00032
00033
00034
00035
00036
00037
00038
00039
00040
00041
00042
00043
00044
00045
00046
00047
00048
00049
root任务起来后创建了3个任务,我们会看到这3个任务创建过程的打印,随后任务运行的过程与上节一致。当系统运行到8000
本节运行结果截图如下:
读者可以访问http://blog.sina.com.cn/ifreecoding网站下载视频,观看全部数据的打印过程,可以看到实际运行的结果与我们上面推断的结果是一致的。
使用工具软件将任务切换过程的数据解析为图形,结果如下图所示:
从图中可以清晰的看到2000