|
这一次的任务时解决RAW OS 任务管理内容。
预备知识:
1.RAW OS 的任务状态
自己安排的学习流程:
软件检测栈空间:
使用的是上一篇文章中已经搭建好的F4工程,在任务1中调用raw_task_stack_check函数,再通过Watch观察任务堆栈值,
这是任务创建时TEST_TASK_STK_SIZE为400时StackSpace的值
这是任务创建时StackSpace为300时的值,可以看出来,StackSpace反应了当前剩余的可用任务堆栈,所以,当这个值比较大的时候我们可以减小任务堆栈的大小,以节约我们的RAM。
任务时间管理:
上一篇文章只是简单使用了raw_sleep,不知道其中的原理,实际上,这个函数以内核时钟(Tick)为单位,找到定义 raw_sleep 它的默认值为100(PS,楼主今天看到一个帖子说基于X86系统默认时钟一般也为100)因此。之前的raw_sleep (50)将会使任务睡眠500MS。
任务挂起与恢复:
为了进行这一部分的学习,创建了一个优先级比TASK1高的任务TASK2。由于TASK2中没有SLEEP或者相同功能的函数,在仿真中可以看到:
TASK1的断点从未进去过。
运行了raw_task_suspend将任务2挂起后:
TASK1的断点就可以进去了。
可以在TASK1中使用raw_task_resume恢复TASK2。
动态更改优先级:
代码基本和上次一样,TASK2先挂起自己,进入TASK1,TASK1动态修改自己的优先级,让优先级上升为比TASK2更高,在恢复TASK2,经仿真,TASK2已经抢不过TASK1了 :)
任务删除:
这个就不试了,认为当某一特定条件即一系列事情做完,一个任务永远的不再被需要时,就可以删除了,删除前要释放申请的内存,还有锁,现在还不理解锁是什么意思,需要进一步学习。
设置任务私有属性:
这个功能最初看了比较奇怪,这和全局变量有啥区别呀??然后看了该函数的实现过程才恍然大悟,任务结构体内有一个变量 user_data_pointer,所谓的私有属性将于它挂钩,有利于封装 :)
经试验确实是可以的,
通过raw_set_task_user_point传递了私有变量,然后在WATCH中可以看到user_data_pointer[0]已经存放了我自建的结构体的地址。
中止任务使之等待信号量:
计划:我们需要先中止一个任务,用sleep函数使任务处在等待时间信号的状态,再用raw_task_wait_abort把它唤醒。
代码如下
void test_task1(void * pParam)
{
RAW_U32 * Res;
while(1) {
Res = (raw_get_task_user_point(&test_task_obj1, 0));
if((*Res) == 1)
{
raw_sleep(50);
}
raw_task_stack_check(&test_task_obj1, &StackSpace);
}
}
void test_task2(void * pParam)
{
RAW_U32 * Res;
RAW_U32 Task2Tmp = 2;
while(1) {
Res = (raw_get_task_user_point(&test_task_obj1, 0));
if((*Res) == 1)
{
raw_task_wait_abort(&test_task_obj1);
raw_set_task_user_point(&test_task_obj1,&Task2Tmp, 0);
}
}
}
经检验,raw_task_wait_abort立即将睡眠状态的test_task1唤醒,特别需要注意,唤醒后TASK1是从Res = (raw_get_task_user_point(&test_task_obj1, 0));开始的!!!。
系统使用数据段空间:
raw_get_system_global_space函数内部是用sizeof 实验计算总空间的。
楼主在TASK1中重复调用它进行系统数据段总空间测试,
可以看到,什么都没变的情况下数值为6033
进行了四个实验:
1.在main.c中添加全局变量 效果:
2.在TASK1内部添加局部变量 效果:
3.增加了TASK1 的申请时的栈空间 效果:
4.又申请了一个任务,效果:
不得不说,楼主惊呆了,上面4个做法测得的SPACE都还是6033。。。好,任务管理告一段落,我继续测试怎样可以让SPACE变化。。。
|
本帖子中包含更多资源
您需要 登录 才可以下载或查看,没有帐号?注册
x
阿莫论坛20周年了!感谢大家的支持与爱护!!
知道什么是神吗?其实神本来也是人,只不过神做了人做不到的事情 所以才成了神。 (头文字D, 杜汶泽)
|