shouqiang_zhang
发表于 2015-2-16 10:40:59
有没有移植到STM32上的例程,学习下.
为而不争
发表于 2015-3-6 14:35:34
eddia2012 发表于 2012-12-8 22:21
当timeover = 255时相当无穷等待
/************************************************
Micro : Ints_even_clear
Stacks :
Note : 清除进程传事件消息
Updata : 2012-11-21
************************************************/
#define Ints_even_clear() \
taskEvenRdy &= 0xff ^ (1<<taskID)
这里是当前任务将自已清掉。有什么用处呢?
pop_wu
发表于 2015-3-8 14:37:32
楼主写的好厉害
为而不争
发表于 2015-3-10 16:03:20
smset 发表于 2012-12-18 18:29
优化无止境!呵呵,330楼看似不能再优化了,但我再尝试做一次优化:
敬请评测该版本,看是否还能优化:在k ...
你好请问这个子函数如果有参数的话怎么调用呢
为而不争
发表于 2015-3-10 16:14:46
holts2 发表于 2012-12-15 12:45
voidtask1(){
static unsigned char lc=0; switch(lc){ case 0:
while(1){
你好请问这个调度器如果要调用带参数的子函数,要怎么弄呢
holts2
发表于 2015-3-10 16:29:34
为而不争 发表于 2015-3-10 16:14
你好请问这个调度器如果要调用带参数的子函数,要怎么弄呢
你平常乍写就咋写啊
为而不争
发表于 2015-3-10 16:38:52
holts2 发表于 2015-3-10 16:29
你平常乍写就咋写啊
如果里面要用到WaitX和WaitSemX,
为而不争
发表于 2015-3-10 16:41:30
eddia2012 发表于 2012-12-14 19:27
请出下信号量应用的例子哦。
你好请问这个调度器如果要调用带参数的子函数,要怎么弄呢
jesse2012
发表于 2015-3-11 10:24:47
很长 很好 但还是要慢慢学 慢慢看一下不能够懂的
tangmix
发表于 2015-3-11 16:02:05
LZ出个教程吧,像我这种小白真的不太看得懂
tangmix
发表于 2015-3-11 16:34:20
本帖最后由 tangmix 于 2015-3-11 16:39 编辑
看了一下LZ的代码,有几个问题不明白,希望LZ能帮忙解答:
unsigned char task0(){
static unsigned char _lc=0;
switch(_lc)
{
default:
while(1)
{
//WaitX(50);
do
{
_lc=(__LINE__+((__LINE__%256)==0))%256;
return tickets ;
}
while(0);
case (__LINE__+((__LINE__%256)==0))%256:
LED0=!LED0;
};
};
_lc=0;
return 255;
}
这是我展开后的代码,其中的while循环是在什么时候跳出来的呢?
wudision
发表于 2015-3-11 17:15:54
smset 发表于 2012-11-26 11:42
自己写的,抛砖引玉,希望大家指正哈。本例用于说明调度器的核心思想,当然也可以用,但实际上还可以做得更 ...
非常感谢 马克先
wofei3344
发表于 2015-3-11 17:28:51
膜拜啊,这么多人顶贴,一直想学,无奈基础太差,都看不懂,直到遇到你......
为而不争
发表于 2015-3-12 14:31:43
你好这样的话这个调度器里面是不是就就不能再用switch 了?
firstzys
发表于 2015-3-12 15:36:38
如果没有定时器,怎么调度
wader
发表于 2015-4-10 16:11:54
总算仔细的看完了mark下
jingdong
发表于 2015-4-11 14:02:37
好不容易注册成功,下载来看看。
jingdong
发表于 2015-4-13 19:47:28
有了这个字程序方便多了。
yikeai
发表于 2015-4-16 12:12:51
谢谢朋友的分享,学到很多的编程技术。
stewen
发表于 2015-4-25 11:42:03
学习学习。谢谢分享!
wt19891114
发表于 2015-4-28 14:49:00
谢谢 学习了。
夜尽天明
发表于 2015-4-29 08:26:33
12年的帖子现在还有人回,这个实时性不够强,在学校用用可以,做产品不行。
qiao_zlj
发表于 2015-4-29 08:40:11
一直裸奔中~是改考虑穿几件衣服了~
Cumu
发表于 2015-4-30 15:55:51
记号 有时间试一下
lxren
发表于 2015-4-30 17:01:35
Mark,待有空学习学习!
lxk52000
发表于 2015-5-1 11:25:50
学习研究中,谢谢!
zl_123
发表于 2015-5-1 12:12:49
看了好几次,收货很多,mark
scream
发表于 2015-5-1 14:07:58
已经收藏,好好学习一下!
yangxx
发表于 2015-5-3 19:48:10
好贴 Mark之
最笨的企鹅
发表于 2015-5-3 20:23:41
楼主太厉害了!
Cumu
发表于 2015-5-6 16:45:20
用STM32测试了一下,非常好用
peecehood
发表于 2015-5-6 16:59:21
WaitX不用的话就变无限回圈?所以最少要放WaitX(1)?
proc
发表于 2015-5-6 17:03:58
收藏先,谢谢分享
zzzhpzhp
发表于 2015-5-7 01:32:31
感谢楼主的无私奉献
bondxie3
发表于 2015-5-7 09:52:14
我很喜欢这个调度器, 用到几个小产品中了. 可是回帖越来越没味道! 想学想用就把这1000多楼看一遍! 不要妄下结论!
关键点:
1.case后面的是标号, switch只查找标号, 找到了就直接跳转过去,
而不论这个标号在什么地方, 即使是在while中, for中, if...else...中.
2.任务函数内部不能再用switch语句了. 这种情况用 if else.
任务不要返回自定义数据, 因为return已经被赋予任务延时的特定意义, 这是返回型任务函数版本的一个强制要求.
peecehood
发表于 2015-5-7 11:11:24
有几个使用到do while(0);为什么要这样用?没用效果相同,有什么特别用意?
另__LINE__+((__LINE__%256)==0))%256其实直接用__LINE__效果也一样,反正__LINE__超过256存到unsigned char中还是一样把前面省略。
bondxie3
发表于 2015-5-7 11:29:58
peecehood 发表于 2015-5-7 11:11
有几个使用到do while(0);为什么要这样用?没用效果相同,有什么特别用意?
另__LINE__+((__LINE__%256)==0 ...
do{......}while(0); 是为了多条语句的定义,防止逻辑错误.
peecehood
发表于 2015-5-7 11:47:24
本帖最后由 peecehood 于 2015-5-7 12:04 编辑
我想用{.....}也是一样的吧
__LINE__+((__LINE__%256)==0))%256 还是只是让他不为零,为零也没差的说
lizai10
发表于 2015-5-7 12:01:31
收藏留着备用
glenclh
发表于 2015-5-7 18:52:44
按个爪,楼主出个思路的教程呗
wanglei11235
发表于 2015-5-15 11:37:18
写的真好,读了几遍,收获很大
zhonghua_li
发表于 2015-5-15 14:28:51
看来没听过 Protothreads 人还真多。
从Protothreads 中得到灵感,运用到状态机中,有时候直接用状态机来写更灵活些。
rundream
发表于 2015-6-3 13:42:39
本帖最后由 rundream 于 2015-6-4 12:08 编辑
再发布一个更新的版本(感谢坛友支持):
在IAR6.7下编译通过。(选用:Misra C 2004)
/****小小调度器开始**********************************************/
#define MAXTASKS 3U
volatile static unsigned char timers;
#define _SS static unsigned char _lc=0U; switch(_lc){case 0U:
#define _EE break; default:break;}_lc=0U;return 255U;
#define WaitX(tickets) _lc=(unsigned char)(__LINE__)%255U+1U;if(_lc){return (tickets);}break; case ((unsigned char)(__LINE__)%255U)+1U:
#define RunTask(TaskName,TaskID)do {if (timers[(TaskID)]==0U){ timers[(TaskID)]=(TaskName)(); } } while(0)
#define RunTaskA(TaskName,TaskID) { if (timers[(TaskID)]==0U) {timers[(TaskID)]=(TaskName)(); continue;} } /*前面的任务优先保证执行*/
#define CallSub(SubTaskName) do {unsigned char currdt; _lc=(unsigned char)(__LINE__)%255U+1U; if(_lc) {return 0U;} break; case (unsigned char)(__LINE__)%255U+1U:currdt=(SubTaskName)(); if(currdt!=255U) {return currdt;}} while(0);
#define InitTasks() do {unsigned char i; for(i=MAXTASKS;i>0U ;i--) {timers=0U;} } while(0)
#define UpdateTimers() do { unsigned char i;for(i=MAXTASKS;i>0U ;i--){ if(timers!=0U){ if(timers!=255U) { timers--;} } }} while(0)
#define SEM unsigned int
/*初始化信号量*/
#define InitSem(sem) (sem)=0;
/*等待信号量*/
#define WaitSem(sem) do{ (sem)=1; WaitX(0); if ((sem)>0) return 1;} while(0);
/*等待信号量或定时器溢出, 定时器tickets 最大为0xFFFE*/
#define WaitSemX(sem,tickets)do { (sem)=(tickets)+1; WaitX(0); if((sem)>1){ (sem)--;return 1;} } while(0);
/*发送信号量*/
#define SendSem(sem)do {(sem)=0;} while(0);
/*****小小调度器结束*******************************************************/
static unsigned char task0(void){
static int i;
_SS
for(i=0;i<11;i++){
WaitX(10U);
}
_EE
}
static unsigned char task1(void){
_SS
while(1){
WaitX(10U);
}
_EE
}
static unsigned char task2(void){
_SS
while(1){
WaitX(10U);
}
_EE
}
void InitT0()
{
TMOD = 0x21;
IE |= 0x82;// 12t
TL0=0Xff;
TH0=0XDB;
TR0 = 1;
}
void INTT0(void) interrupt 1 using 1
{
TL0=0Xff; //10ms 重装
TH0=0XDB;//b7;
UpdateTimers();
RunTask(task0,0);//任务0具有精确按时获得执行的权限,要求:task0每次执行消耗时间<0.5个 ticket
}
int main(void)
{
InitT0();
InitTasks();
while(1){
RunTaskA(task1,1);//任务一具有比任务二优先执行的权限
RunTaskA(task2,2);
}
}
holts2
发表于 2015-6-3 13:47:46
rundream 发表于 2015-6-3 13:42
再发布一个更新的版本(感谢坛友支持):
在IAR6.7下编译通过。(选用:Misra C 2004)
是原作者吗? 怎么换了ID ?
rundream
发表于 2015-6-3 14:20:13
{:lol:}{:lol:}是的。
sinxcosytana
发表于 2015-6-3 16:12:37
学习了,收藏下
shower.xu
发表于 2015-6-3 16:24:10
rundream 发表于 2015-6-3 13:42
再发布一个更新的版本(感谢坛友支持):
在IAR6.7下编译通过。(选用:Misra C 2004)
首先谢谢您,感觉很好用。
请问这一次更新了什么新功能?
顺便请教几个问题:
1、任务指令语句长度是不是不能大于255;waitx()里面小于256是不是和这个有关?
2、任务内函数调用waitx()有什么限制么?
3、任务间数据的互相访问怎么处理比较好?比如结构体或数组
4、我如果想一个任务只运行一次就挂起自身,有什么办法?可以被其它任务唤醒并立即执行,有什么办法?
rundream
发表于 2015-6-3 16:40:35
本帖最后由 rundream 于 2015-6-3 16:50 编辑
shower.xu 发表于 2015-6-3 16:24
首先谢谢您,感觉很好用。
请问这一次更新了什么新功能?
这次主要是对行号的选取做了调整,使得任务函数内代码行数在255内时,不可能出现行号重复。
另外就是调整为尽量支持Misra C 2004规则。
1、任务指令语句长度是不是不能大于255;waitx()里面小于256是不是和这个有关?
答:任务指令语句的行数是可以大于255的,在小于255行时,是不可能出现行号重复的,在大于等于255行后有出现重复的行的概率,导致编译失败,可通过加空行来解决。
waitx()里面小于255和这个无关。
2、任务内函数调用waitx()有什么限制么?
答:WaitX()里面的值,要小于255。
3、任务间数据的互相访问怎么处理比较好?比如结构体或数组
答:使用全局变量,或自己实现FIFO。
4、我如果想一个任务只运行一次就挂起自身,有什么办法?可以被其它任务唤醒并立即执行,有什么办法?
答:使用信号量。
shower.xu
发表于 2015-6-3 17:02:11
rundream 发表于 2015-6-3 16:40
这次主要是对行号的选取做了调整,使得任务函数内代码行数在255内时,不可能出现行号重复。
另外就是调整 ...
谢谢,明白了
four_zhg
发表于 2015-6-3 21:55:27
楼主终于又再现了,可以有问题问问了,先下来研究一下
zsdshuai
发表于 2015-6-4 09:53:04
本帖最后由 zsdshuai 于 2015-6-4 09:59 编辑
rundream 发表于 2015-6-3 13:42
再发布一个更新的版本(感谢坛友支持):
在IAR6.7下编译通过。(选用:Misra C 2004)
太厉害了!
有几个问题请教,希望不吝赐教
1. Ticket能不能选1ms,选1ms会带来什么问题,需要注意哪些
2. 为什么要求任务局部变量要求定义为静态变量? 任务内调用的函数是不是局部变量也必须是静态的,任务内调用的子函数内用switch没问题吧
3. #define WaitX(tickets) _lc=(unsigned char)(__LINE__)%255U+1U;if(_lc){return (tickets);}break; case ((unsigned char)(__LINE__)%255U)+1U:
这个宏定义中为什么去判断 if(_lc),感觉_lc不会等于0啊
4.在PIC中移植中出现一个问题,程序框架如下
unsigned char flg=0;
main()
{
if()//按键按下
{
flg=1;
}
else
{
flg=0;
}
while(1)
{
if(flg)
{
RunTask(TASK2,2);
}
RunTask(TASK0,0);
RunTask(TASK1,1);
}
}
我的本意是:如果按住按键开机,那么就让Task2运行,结果实际没按按钮也运行了Task2,我在Task2那里设置断点会跳进去,我用debug观察flg一直为0,很纳闷,可惜我对mplab这开发环境不熟悉,不知道怎么找到断点的上一条语句。我可以确定程序其它地方没有用flag。
我的问题是:我的任务写的不好,我的ticket是1ms,是不是太快了引起的,这些有可能导致出现这个问题吗?到底可能是哪里出了问题呢?对了,当时用的是793楼的调度器
希望不吝赐教,谢谢!
rundream
发表于 2015-6-4 12:25:57
本帖最后由 rundream 于 2015-6-4 12:28 编辑
zsdshuai 发表于 2015-6-4 09:53
太厉害了!
有几个问题请教,希望不吝赐教
1. Ticket能不能选1ms,选1ms会带来什么问题,需要注意哪些
1. Ticket能不能选1ms,选1ms会带来什么问题,需要注意哪些
答. Ticket可以选1ms,选1ms最大的区别是:好处,延迟更精确,中断级别的任务实时性更好。 坏处:导致cpu中断次数变多了,普通任务获得的cpu时间变少了,WaitX()的最大延时变为254毫秒。
2. 为什么要求任务局部变量要求定义为静态变量? 任务内调用的函数是不是局部变量也必须是静态的,任务内调用的子函数内用switch没问题吧
答. 因为任务没有自己的堆栈,释放CPU后再次继续往下运行时,还需要用上次的变量,所以要求定义为静态变量,以便于任务释放CPU后,变量不会
消失。但是任务内调用的函数(子任务函数除外),是可以用动态局部变量的,也可以用switch。
3. #define WaitX(tickets) _lc=(unsigned char)(__LINE__)%255U+1U;if(_lc){return (tickets);}break; case ((unsigned char)(__LINE__)%255U)+1U: 这个宏定义中为什么去判断 if(_lc),感觉_lc不会等于0啊
答.这里的if(_lc) 纯粹是为了通过Misra C规范检查。如果你的编译器没有选中这个misra c规则检查,也可以去掉这个if判断。
4 ...
main进入while(1)循环后,永远不会再有机会去发给flg赋值了。所以需要把赋值部分放到其他地方,最好是放在一个任务里面。
另外,建议main函数里面就是单纯的调用各个RunTask函数,不再判断,要判断可以在任务函数内部去判断。
zsdshuai
发表于 2015-6-4 12:35:51
rundream 发表于 2015-6-4 12:25
1. Ticket能不能选1ms,选1ms会带来什么问题,需要注意哪些
答. Ticket可以选1ms,选1ms最大的区别是:好 ...
首先非常感谢你的回复,其次是由于我把Ticket改为1ms了,有时候为了延时更多的时间,会有连续两条waitx语句,譬如:
waitx(200);
waitx(200);
waitx(200);
对于这个调度器最新的版本这样会有问题吗?谢谢!
rundream
发表于 2015-6-4 12:41:54
zsdshuai 发表于 2015-6-4 12:35
首先非常感谢你的回复,其次是由于我把Ticket改为1ms了,有时候为了延时更多的时间,会有连续两条waitx语 ...
最新版本的调度器,这方面已经改进了:
只要任务函数内部的代码行小于255行的, 可以任意连续多行waitx(当然,也是要小于255行),不会出现重复行了。
xxzzhy
发表于 2015-6-4 17:10:03
看似很厉害的。继续关注。
堂吉诃德
发表于 2015-6-5 08:52:45
先收藏,好东西
我命不由天
发表于 2015-6-5 10:56:12
{:handshake:}
suny1022
发表于 2015-6-5 12:23:57
学习了半天,收获不小
城关珠
发表于 2015-6-5 13:11:37
很不错的参列子,收了,顶起来到1000楼
ssaiwo
发表于 2015-6-5 14:19:04
学习了 不错
cd4000
发表于 2015-6-5 14:32:54
学习一下!
shi_90
发表于 2015-7-7 17:17:34
多谢楼主分享!学习中,写了很多程序从来没考虑过用这个!
工业酒精
发表于 2015-7-7 19:51:09
记号,学习一下
索达客
发表于 2015-7-8 09:32:03
支持一下,谢谢楼主分享!
zhudeng66
发表于 2015-7-20 16:29:07
精益求精 支持! 如果直接用状态机是不是好点???
zd0305
发表于 2015-7-20 19:02:26
mplab x+ xc8环境WaitX(30) 报错: constant expression required
wxlcj
发表于 2015-7-28 17:57:08
顶楼主,这个帖子进行了几年了,楼主还在不停的更新,历害。
再一次谢谢楼主,不过说好的教程呢?{:lol:}{:lol:}{:lol:}
rundream
发表于 2015-7-28 18:00:36
wxlcj 发表于 2015-7-28 17:57
顶楼主,这个帖子进行了几年了,楼主还在不停的更新,历害。
再一次谢谢楼主,不过说好的教程呢?{: ...
{:lol:}
你都用于教学了,那教程肯定有现成的。
赶快共享出来!!!
wxlcj
发表于 2015-7-28 20:29:10
rundream 发表于 2015-7-28 18:00
你都用于教学了,那教程肯定有现成的。
赶快共享出来!!!
说来惭愧,一直没有勇气突破自己,很是惭愧。
冷无痕
发表于 2015-7-28 20:29:22
看着很高端的样子,虽然不懂,单必须地顶一发。。。
wxlcj
发表于 2015-7-31 18:00:37
rundream 发表于 2015-7-28 18:00
你都用于教学了,那教程肯定有现成的。
赶快共享出来!!!
为什么在任务中for循环用不起来?我用的是IAR,stm8的片子?
zhaoghsea
发表于 2015-8-13 00:09:42
mute 发表于 2014-7-5 07:34
唯一不好的问题就是无法使用内部的临时变量。
如果全改成static,就浪费了很多ram,与这个调度器节省资源的 ...
顶944楼,大牛啊
lattice2008
发表于 2015-9-17 20:04:02
好东西,收藏了。
qq854149876
发表于 2015-10-8 11:17:46
学习学习
gmyu
发表于 2015-11-17 22:22:36
rundream 发表于 2015-6-4 12:41
最新版本的调度器,这方面已经改进了:
只要任务函数内部的代码行小于255行的, 可以任意连续多行waitx ...
LZ, 如果不用那么极端的精简,比如STM32系列,是否可以直接用PT的word,u16,这样就不必担心行号问题和延时过短。
另外PT里面的条件不仅仅是延时,可以判断其他条件的,你的最新程序里面只有延时的实例,可以写个WaitFlag或者其他的么?
gmyu
发表于 2015-11-18 10:47:44
while(TIMEOUT)
{
WaitX(0);
}
这种方式有问题.使用如下方式才行
do
{
WaitX(0);
}while( TIMEOUT );
可以把这种方式定义成一个宏:
#define WaitUntil(CondExpr,Cyc) do { WaitX(Cyc);}while( !(CondExpr) )
除了延时,可以判断其他条件的写法,参照网友回复,不知这个Cyc是不是一定要等于0
gmyu
发表于 2015-11-18 10:58:32
在pt中有这个函数,作用是Block and wait until condition is true.,感觉非常好用,楼主能不能在小小的上面加上.
参考pt添加:#define WAIT_UNTIL(condition)do {_lc=(__LINE__+((__LINE__%256)==0))%256; }while(0); case (__LINE__+((__LINE__%256)==0))%256: if(!(condition)){return 0 ;}
pt中原函数:
#define PT_WAIT_UNTIL(pt, condition) \
do { \
LC_SET((pt)->lc); \
if(!(condition)) { \
return PT_WAITING; \
} \
} while(0)
lswhome
发表于 2015-11-18 18:34:08
zcan 发表于 2014-7-17 14:56
要插入的代码片断
[/ code] //实际使用时去掉方括号里的那个空格 ...
天呐我先试试
captain_steve
发表于 2015-11-18 19:46:29
mark学习了,单片机调度器
yick
发表于 2015-11-18 20:02:00
mark一下
死神
发表于 2015-11-19 16:31:04
本帖最后由 死神 于 2015-11-19 16:35 编辑
{:lol:}太强了,我要好好学习学习
乐天派
发表于 2015-11-20 10:49:05
我一般定义一个long int全局变量 Ftime=0,在50ms定时器中断中Ftime++, 每个任务x都有自己的计时变量Ftimex,Ftime-Ftimex产生的时间差决定是否运行该任务。
tt98
发表于 2015-11-21 16:54:18
期待教程{:lol:}
cvi670
发表于 2015-11-22 15:25:27
smset 发表于 2012-12-18 18:29
优化无止境!呵呵,330楼看似不能再优化了,但我再尝试做一次优化:
敬请评测该版本,看是否还能优化:在k ...
以前开发的东西都比较简单没有考虑过这个方面现在开发的复杂了慢慢领会到这个 任务调度是多么的重要
8位单片机还是有市场的小而精是我开发电子产品追求的目标
知识阅览者
发表于 2015-11-23 08:16:44
哈哈,这个东西好,一直基本都是在使用裸奔程序,试试操作系统!!!
sunnyczp
发表于 2015-12-3 17:20:48
这个调度器花了两个多小时看完了,真是受益匪浅,感谢楼主,感谢所有分享都者!!
zd0305
发表于 2016-2-2 11:37:53
#define WaitX(tickets) _lc=(unsigned char)(__LINE__)%255U+1U;if(_lc){return (tickets);}break; case ((unsigned char)(__LINE__)%255U)+1U:
最新个这个在 pic mplab x + xc8 还是编译不通过,提示需要常量
aaabbbad
发表于 2016-2-2 17:31:31
好东西,收藏了先
jsszdfdn
发表于 2016-2-3 15:05:25
smset 发表于 2012-12-7 09:48
子任务嵌套调用可以任意多层的,只要不耗尽整个CPU的RAM公共堆栈就行,每增加一层嵌套,RAM公共堆栈会消耗 ...
楼主你好 我有个疑问就是 在定时器分时间段时 进入某任务 这时串口接收到外部数据 这时软件处理上会有冲突么?
Chris_gong
发表于 2016-2-3 20:05:06
调度器,极小资源单片机值得一用 Mark
heimareed
发表于 2016-2-4 00:26:03
又看了一遍。感觉还得看好几遍……
竹叶船
发表于 2016-2-4 01:47:44
漂亮,先收藏起来!
heimareed
发表于 2016-2-15 00:25:01
smset 发表于 2012-12-11 15:05
在211楼版本基础上,增加了信号量SEM, 希望大家验证一下。
257# 引入信号量,一直在寻找信号量的官方实例。
heimareed
发表于 2016-2-15 00:28:17
formatme 发表于 2012-12-14 11:45
能加写一个信号量应用的例子吗?我不知道怎么用
你好,弄明白信号量的用法了吗?求共享,谢谢!
BS_good200xy
发表于 2016-2-28 16:34:30
以前做的单片机程序都是单任务方式,现在正在研究单片机多任务编程方式,楼主这个帖子对我帮助极大,谢谢了.
xxzzhy
发表于 2016-2-28 23:12:08
楼主确实花了心思的。不需哦。顶一个{:lol:}
Danielzpp
发表于 2016-3-30 11:03:58
好帖!!
日日♂夜夜
发表于 2016-3-31 09:17:57
这个宏用的好精妙
shange144k8
发表于 2016-3-31 10:04:57
很好的资料 先收藏了
自由飞儿
发表于 2016-4-1 14:07:50
精辟啊,高手
页:
2
3
4
5
6
7
8
9
10
11
[12]
13