发新帖我要提问
12
返回列表
打印

请教C语言语法问题

[复制链接]
楼主: shuidi_wangdan
手机看帖
扫描二维码
随时随地手机跟帖
21
shuidi_wangdan 发表于 2013-5-16 15:43
为了读取函数的高地址和低地址

浪费内存!你直接赋值table2[x][0]=(uint)fn不就行了吗

使用特权

评论回复
22
ecoren| | 2013-5-17 09:11 | 只看该作者
打酱油

使用特权

评论回复
23
学习_成长| | 2013-5-17 12:25 | 只看该作者
shuidi_wangdan 发表于 2013-5-16 15:44
#define unsiged int uint定义的是字

#define  uint unsiged int 应该这样写吧?

使用特权

评论回复
24
HAPPY小越越| | 2013-5-17 13:26 | 只看该作者
没这么用过。。。

使用特权

评论回复
25
shuidi_wangdan|  楼主 | 2013-5-17 16:44 | 只看该作者
学习_成长 发表于 2013-5-17 12:25
#define  uint unsiged int 应该这样写吧?

对,没注意写错了,谢谢!

使用特权

评论回复
26
huangxz| | 2013-5-17 17:33 | 只看该作者
本帖最后由 huangxz 于 2013-5-17 17:34 编辑
shuidi_wangdan 发表于 2013-5-16 15:44
#define unsiged int uint定义的是字


楼主还是抛个demo出来看看吧,搞的我们稀里糊涂的,我用c18也编译不过,难道真有这么神的编译器能编译过这样的代码?

使用特权

评论回复
27
shuidi_wangdan|  楼主 | 2013-5-18 07:55 | 只看该作者
huangxz 发表于 2013-5-17 17:33
楼主还是抛个demo出来看看吧,搞的我们稀里糊涂的,我用c18也编译不过,难道真有这么神的编译器能编译过这样 ...

好的!

使用特权

评论回复
28
shuidi_wangdan|  楼主 | 2013-5-18 07:56 | 只看该作者
#include <reg51.h>
/*============================以下为任务管理器代码============================*/

#define MAX_TASKS 3//任务槽个数.在本例中并未考虑任务换入换出,所以实际运行的任务有多少个,就定义多少个任务槽,不可多定义或少定义
//任务的栈指针
unsigned char idata task_sp[MAX_TASKS];                                                                               
#define MAX_TASK_DEP 12 //最大栈深.最低不得少于2个,保守值为12.
                                                //预估方法:以2为基数,每增加一层函数调用,加2字节.如果其间可能发生中断,则还要再加上中断需要的栈深.
                                                //减小栈深的方法:1.尽量少嵌套子程序 2.调子程序前关中断.
unsigned char idata task_stack[MAX_TASKS][MAX_TASK_DEP];//任务堆栈.
unsigned char task_id;//当前活动任务号
//任务切换函数(任务调度器)
void task_switch(){
        task_sp[task_id] = SP;

        if(++task_id == MAX_TASKS)
                task_id = 0;

        SP = task_sp[task_id];
}
//任务装入函数.将指定的函数(参数1)装入指定(参数2)的任务槽中.如果该槽中原来就有任务,则原任务丢失,但系统本身不会发生错误.
void task_load(unsigned int fn, unsigned char tid){
        task_sp[tid] = task_stack[tid] + 1;
        task_stack[tid][0] = (unsigned int)fn & 0xff;
        task_stack[tid][1] = (unsigned int)fn >> 8;
}
//从指定的任务开始运行任务调度.调用该宏后,将永不返回.
#define os_start(tid) {task_id = tid,SP = task_sp[tid];return;}

/*============================以下为测试代码============================*/
unsigned char stra[3], strb[3];//用于内存块复制测试的数组.
//测试任务:复制内存块.每复制一个字节释放CPU一次
void task1(){
        //每复制一个字节释放CPU一次,控制循环的变量必须考虑覆盖
        static unsigned char i;//如果将这个变量前的static去掉,会发生什么事?
        i = 0;

        while(1){//任务必须为死循环,不得退出函数,否则系统会崩溃
                stra[i] = strb[i];
                if(++i == sizeof(stra))
                        i = 0;

                //变量i在这里跨越了task_switch(),因此它必须定义为静态(static),否则它将会被其它进程修改,因为在另一个进程里也会用到该变量所占用的地址.
                task_switch();//释放CPU一会儿,让其它进程有机会运行.如果去掉该行,则别的进程永远不会被调用到
        }
}
//测试任务:复制内存块.每复制一个字节释放CPU一次.
void task2(){
        //每复制一个字节释放CPU一次,控制循环的变量必须考虑覆盖
        static unsigned char i;//如果将这个变量前的static去掉,将会发生覆盖问题.task1()和task2()会被编译器分配到同一个内存地址上,当两个任务同时运行时,i的值就会被两个任务改来改去
        i = 0;

        while(1){//任务必须为死循环,不得退出函数,否则系统会崩溃
                stra[i] = strb[i];
                if(++i == sizeof(stra))
                        i = 0;

                //变量i在这里跨越了task_switch(),因此它必须定义为静态(static),否则它将会被其它进程修改,因为在另一个进程里也会用到该变量所占用的地址.
                task_switch();//释放CPU一会儿,让其它进程有机会运行.如果去掉该行,则别的进程永远不会被调用到
        }
}
//测试任务:复制内存块.复制完所有字节后释放CPU一次.
void task3(){
        //复制全部字节后才释放CPU,控制循环的变量不须考虑覆盖
        unsigned char i;//这个变量前不需要加static,因为在它的作用域内并没有释放过CPU

        while(1){//任务必须为死循环,不得退出函数,否则系统会崩溃
                i = sizeof(stra);
                do{
                        stra[i-1] = strb[i-1];
                }while(--i);

                //变量i在这里已完成它的使命,所以无需定义为静态.你甚至可以定义为寄存器型(regiter)
                task_switch();//释放CPU一会儿,让其它进程有机会运行.如果去掉该行,则别的进程永远不会被调用到
        }
}
void main(){
        //在这个示例里并没有考虑任务的换入换出,所以任务槽必须全部用完,否则系统会崩溃.
        //这里装载了三个任务,因此在定义MAX_TASKS时也必须定义为3
        task_load(task1, 0);//将task1函数装入0号槽
        task_load(task2, 1);//将task2函数装入1号槽
        task_load(task3, 2);//将task3函数装入2号槽

        os_start(0);//启动任务调度,并从0号槽开始运行.参数改为1,则首先运行1号槽.
                                //调用该宏后,程序流将永不再返回main(),也就是说,该语句行之后的所有语句都不被执行到.
}

使用特权

评论回复
29
shuidi_wangdan|  楼主 | 2013-5-18 07:57 | 只看该作者
本帖最后由 shuidi_wangdan 于 2013-5-18 09:18 编辑

这是源代码!我在发一个帖子,把所有资料传上来!

https://bbs.21ic.com/icview-551028-1-1.html

使用特权

评论回复
30
shuidi_wangdan|  楼主 | 2013-5-18 09:43 | 只看该作者
结贴了,谢谢大家!

使用特权

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

本版积分规则