打印

关于单片机编程魔法 疑问

[复制链接]
918|5
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
mlmbcsz|  楼主 | 2016-11-9 08:30 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
沙发
mlmbcsz|  楼主 | 2016-11-9 08:45 | 只看该作者
char myThread(myTask *Task, unsigned char *Process)

        ...................
        if(*Process>4)
        {
                ret = -1;        //线程结束
                *Process = 0;
        }

        return ret;

如果线程结束时返回-1 如果线程没有结束一直返回0,那么unsigned char isTask_3_Living        = 5; isTask_3_Living += myThread(&Task3, &Task3_Thread_Process);          unsigned char Task3_Thread_Process = 0; if(isTask_3_Living)   isTask_3_Living = 0时任务三线程才结束,可是  isTask_3_Living += myThread(&Task3, &Task3_Thread_Process);循环5次才返回-1,什么时候任务三线程才结束呢?有点不理解!请指教!谢谢!

使用特权

评论回复
板凳
mlmbcsz|  楼主 | 2016-11-9 15:29 | 只看该作者
#include <stdlib.h>

typedef struct _myTask
{
        struct _coefficient
        {
                unsigned char a;
                unsigned char b;
                unsigned char c;
        } co;

        struct _variable
        {
                unsigned int x;
                unsigned long y;
        } v;
} myTask;


#define THREAD_OVER                        -1               
#define THREAD_NOTOVER                0               


char myThread(myTask *Task, unsigned char *Process)
{
        unsigned int z;
        char ret = 0;

        switch(*Process)
        {
                case 0:
                        Task->v.x = rand();               
                        Task->v.y = 3;
                        break;
                case 1:
                        Task->v.y *= Task->v.x;
                        Task->v.y *= Task->v.x;
                        break;
                case 2:
                        z = 7 * Task->co.a * Task->co.b * Task->v.x;
                        Task->v.y += z;
                        break;
                case 3:
                        z = Task->co.c;
                        Task->v.y += z;
        }

        (*Process)++;
        if(*Process>4)
        {
                ret = -1;       
                *Process = 0;
        }

        return ret;
}


myTask Task1, Task2, Task3;



void InitTask(myTask *Task, unsigned char a, unsigned char b, unsigned char c)
{
        Task->co.a = a;
        Task->co.b = b;
        Task->co.c = c;
}

main(void)
{

        bit isTask_1_Living        = 1;
        unsigned char Task1_Thread_Process = 0;

        bit isTask_2_Living        = 1;
        unsigned char Task2_Thread_Process = 0;

        unsigned char isTask_3_Living        = 5;
        unsigned char Task3_Thread_Process = 0;


        InitTask(&Task1, 9, 7, 18);
        InitTask(&Task2, 4, 13, 16);
        InitTask(&Task3, 2, 24, 3);

        while(1)
        {
                if(isTask_1_Living)       
                {
                        isTask_1_Living = !myThread(&Task1, &Task1_Thread_Process);
                }

                if(isTask_2_Living)       
                {
                        isTask_2_Living = !myThread(&Task2, &Task2_Thread_Process);
                }

                if(isTask_3_Living)       
                {
                        isTask_3_Living += myThread(&Task3, &Task3_Thread_Process);//isTask_3_Living = isTask_3_Living + myThread(&Task3, &Task3_Thread_Process)
                }
        }
}
这是整个程序代码!请指教一下!非常感谢!

使用特权

评论回复
地板
mlmbcsz|  楼主 | 2016-11-9 21:04 | 只看该作者
其实我是这里不理解: if(isTask_1_Living) 这句代码判断任务一活着就执行isTask_1_Living = !myThread(&Task1, &Task1_Thread_Process);而myThread(&Task1, &Task1_Thread_Process)返回0或-1,那么这个任务永远执行着 如果myThread(&Task1, &Task1_Thread_Process)返回-1,!-1等于?

使用特权

评论回复
5
yu515301489| | 2016-11-10 08:28 | 只看该作者
yyy71cj 发表于 2016-11-9 19:55
这在于你自己控制呀。
一个线程可以服务于5个不同的任务。因为代码只有一份,如果开启了5个任务,你不能 ...

666

使用特权

评论回复
6
mlmbcsz|  楼主 | 2016-11-11 11:05 | 只看该作者
一个线程可以服务于5个不同的任务。因为代码只有一份,如果开启了5个任务,你不能因为某一个任务结束而让所有任务都运行不了这个线程。
您的意思是一个线程可以服务于5个不同的任务,也可以服务5个以上不同的任务吧!

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

4

主题

30

帖子

1

粉丝