搜索
bottom↓
回复: 7

RAW OS 基于STM32F1/F4 学习笔记 任务管理篇

[复制链接]

出0入0汤圆

发表于 2014-2-4 22:11:42 | 显示全部楼层 |阅读模式
这一次的任务时解决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, 杜汶泽)

出0入0汤圆

 楼主| 发表于 2014-2-4 22:15:40 | 显示全部楼层
补一张图,测试空间为6033的那张

本帖子中包含更多资源

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

x

出0入0汤圆

 楼主| 发表于 2014-2-4 22:26:17 | 显示全部楼层
楼主抑制住了无语的情绪,决定把这个SPACE问题作为遗留问题,到最后解决最后一个RAW 模块时再重头考虑,毕竟这个东西不是太重要,不会对运用RAW OS造成大的阻碍

出0入0汤圆

 楼主| 发表于 2014-2-4 22:45:58 | 显示全部楼层
勘误:第一行不是任务时而是任务是

实际上,这个函数以内核时钟(Tick)为单位,找到定义 raw_sleep 它的默认值为100
这句话是错的,应为找到定义 raw_sleep RAW_TICKS_PER_SECOND它的默认值为100

出0入0汤圆

发表于 2014-2-5 10:20:39 | 显示全部楼层
我补充一下,因为VC的仿真环境原理是,raw-os的一个任务映射windows 的一个线程,所以任务的栈空间是挂在windows 线程的空间上的,无法侦测到。你拿一块开发板一试便知道了,那是真实的开发环境。

出0入0汤圆

发表于 2014-2-5 10:22:44 | 显示全部楼层
操作系统的tick 值不能太高,高了会影响整个系统的运行效率,一直不断定时器中断的话,cpu利用率消耗会很明显的。100是大家的一个经验值。并不是很玄乎的东西。

出130入129汤圆

发表于 2014-2-5 10:33:40 | 显示全部楼层
lulu爱 发表于 2014-2-5 10:22
操作系统的tick 值不能太高,高了会影响整个系统的运行效率,一直不断定时器中断的话,cpu利用率消耗会很明 ...

我看QP例子的SysTick一般是10ms,请问RAW-OS一般多少MS

出0入0汤圆

发表于 2014-2-5 16:09:33 | 显示全部楼层
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片。注意:要连续压缩2次才能满足要求!!】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|Archiver|amobbs.com 阿莫电子技术论坛 ( 粤ICP备2022115958号, 版权所有:东莞阿莫电子贸易商行 创办于2004年 (公安交互式论坛备案:44190002001997 ) )

GMT+8, 2024-7-23 07:24

© Since 2004 www.amobbs.com, 原www.ourdev.cn, 原www.ouravr.com

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