搜索
bottom↓
回复: 2

像是私有数据

[复制链接]

出0入0汤圆

发表于 2011-3-9 10:52:57 | 显示全部楼层 |阅读模式
请教各位:
练习多任务。任务TaskStart创建了3个任务,代码相同,都是Task。Task中的局部变量x和y的值是如何保护的呢?看运行结果,x和y像是任务的私有数据,因为没有被其他任务破坏。
代码附后,谢谢!

#include "includes.h"

#define                TASK_STK_SIZE        512

#define                TASK1_PRIO                0
#define                TASK2_PRIO                2
#define                TASK3_PRIO                4
#define                TASK4_PRIO                6


OS_STK                Task1Stk[TASK_STK_SIZE];
OS_STK                Task2Stk[TASK_STK_SIZE];
OS_STK                Task3Stk[TASK_STK_SIZE];
OS_STK                Task4Stk[TASK_STK_SIZE];

INT16S                key;

struct demodata
{
        char        chrDsp;
        INT8U        xStart;
        INT8U        xEnd;
        INT8U        dlySec;
} arg[] = {        { '1', 0, 15, 2 },
                { '2', 20, 35, 4 },
                { '3', 40, 55, 1 },
                { '4', 60, 75, 3 }
        };

void TaskStart(void *pdata);
void Task(void *pdata);

void main(void)
{
        OSInit();

        PC_DOSSaveReturn();
        PC_VectSet(uCOS, OSCtxSw);

        OSTaskCreate(TaskStart, &arg[0], &Task1Stk[TASK_STK_SIZE - 1], TASK1_PRIO);

        OSStart();
}

void TaskStart(void *pdata)
{
        struct demodata        *p = (struct demodata *)pdata;
        INT8U        x = p->xStart, y = 0;

        OS_ENTER_CRITICAL();
        PC_VectSet(0x08, OSTickISR);
        PC_SetTickRate(OS_TICKS_PER_SEC);
        OS_EXIT_CRITICAL();

        OSStatInit();

        OSTaskCreate(Task, &arg[1], &Task2Stk[TASK_STK_SIZE - 1], TASK2_PRIO);
        OSTaskCreate(Task, &arg[2], &Task3Stk[TASK_STK_SIZE - 1], TASK3_PRIO);
        OSTaskCreate(Task, &arg[3], &Task4Stk[TASK_STK_SIZE - 1], TASK4_PRIO);

        for (;;)
        {
                if (x == p->xEnd)
                {
                        x = p->xStart;
                        y += 2;
                }

                PC_DispChar(x, y, p->chrDsp, DISP_BGND_BLACK + DISP_FGND_WHITE);
                x++;

                if (PC_GetKey(&key) == TRUE)
                        if (key == 0x1B)
                                PC_DOSReturn();

                OSTimeDlyHMSM(0, 0, p->dlySec, 0);
        }
}

void Task(void *pdata)
{
        struct demodata        *p = (struct demodata *)pdata;
        INT8U        x = p->xStart, y = 0;

        for (;;)
        {
                if (x == p->xEnd)
                {
                        x = p->xStart;
                        y += 2;
                }
                PC_DispChar(x, y, p->chrDsp, DISP_BGND_BLACK + DISP_FGND_WHITE);
                x++;
                OSTimeDlyHMSM(0, 0, p->dlySec, 0);
        }
}

阿莫论坛20周年了!感谢大家的支持与爱护!!

知道什么是神吗?其实神本来也是人,只不过神做了人做不到的事情 所以才成了神。 (头文字D, 杜汶泽)

出0入0汤圆

 楼主| 发表于 2011-3-11 09:37:02 | 显示全部楼层
如果在常规操作系统下直接调用函数,操作系统会分配栈,保存局部变量的。ucos保存局部变量的代码在哪里?
请知情者不吝赐教,谢谢!

出0入0汤圆

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

本版积分规则

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

GMT+8, 2024-7-23 17:30

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

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