⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 schedule.lis

📁 avr单片机ATMega16对三相异步电机的智能控制源码
💻 LIS
📖 第 1 页 / 共 3 页
字号:
                        .module schedule.c
                        .area text(rom, con, rel)
 0000                   .dbfile E:\_ING\文档\_STQ\easy-STQ-20080712\schedule.c
 0000                   .dbfunc e SCH_Dispatch_Tasks _SCH_Dispatch_Tasks fV
 0000           ;          Index -> R20
                        .even
 0000           _SCH_Dispatch_Tasks::
 0000 0E940000          xcall push_gset1
 0004                   .dbline -1
 0004                   .dbline 49
 0004           ; 
 0004           ; ///////////////////////////////////////////////////////////////
 0004           ; /**************************************************************
 0004           ; 
 0004           ;       公司名称:       扬州恒博科技
 0004           ;       模块名  :       点动型STQ执行机构主控程序 
 0004           ;       创建人  :       章俭文                                         
 0004           ;       日期    :       2008/08/19                                              
 0004           ;       功能描述:   完成对本地旋钮和远程开关量的控制功能                                
 0004           ;       其它说明:   编译环境为ICCAVR V6.31A                                            
 0004           ;       版本    :       V1.0
 0004           ; 
 0004           ; **************************************************************/
 0004           ; ///////////////////////////////////////////////////////////////
 0004           ; 
 0004           ; #define SCHEDULE_GLOBAL
 0004           ; #include "schedule.h"
 0004           ; 
 0004           ; 
 0004           ; static void SCH_Updata(void);
 0004           ; 
 0004           ; 
 0004           ; // 在任一时刻要求的任务最大数目
 0004           ; #define SCH_MAX_TASKS (3)
 0004           ; 
 0004           ; // 任务队列
 0004           ; sTask SCH_tasks_G[SCH_MAX_TASKS];
 0004           ; 
 0004           ; // 错误代码
 0004           ; #define ERROR_SCH_TOO_MANY_TASKS (1)
 0004           ; #define ERROR_SCH_CANNOT_DELETE_TASK (2)
 0004           ; 
 0004           ; #define RETURN_NORMAL 0
 0004           ; #define RETURN_ERROR 1
 0004           ; 
 0004           ; 
 0004           ; 
 0004           ; 
 0004           ; /*---------------------------------------------------------*-
 0004           ;  * 函数名称: SCH_Dispatch_Tasks()
 0004           ;  * 入  口: 
 0004           ;  * 出  口:
 0004           ;  * 函数功能: 调度函数,当一个任务()需要运行时,此函数将运行它,
 0004           ;  * 
 0004           ;  * 说  明: 这个函数必须被主循环(重复)调用 
 0004           ; -*---------------------------------------------------------*/
 0004           ; 
 0004           ; void SCH_Dispatch_Tasks(void)
 0004           ; {
 0004                   .dbline 53
 0004           ;       unsigned char Index;
 0004           ; 
 0004           ;       // 调度(运行)下一个任务(如果有任务就绪)
 0004           ;       for (Index=0; Index<SCH_MAX_TASKS; Index++)
 0004 4427              clr R20
 0006 32C0              xjmp L8
 0008           L5:
 0008                   .dbline 54
 0008           ;       {
 0008                   .dbline 55
 0008           ;               if (SCH_tasks_G[Index].RunMe > 0)
 0008 87E0              ldi R24,7
 000A 849F              mul R24,R20
 000C F001              movw R30,R0
 000E 80E0              ldi R24,<_SCH_tasks_G+6
 0010 90E0              ldi R25,>_SCH_tasks_G+6
 0012 E80F              add R30,R24
 0014 F91F              adc R31,R25
 0016 2080              ldd R2,z+0
 0018 3324              clr R3
 001A 3214              cp R3,R2
 001C 30F5              brsh L9
 001E                   .dbline 56
 001E           ;               {
 001E                   .dbline 58
 001E           ;                       // 运行任务
 001E           ;                       (*SCH_tasks_G[Index].pTask)();
 001E 87E0              ldi R24,7
 0020 849F              mul R24,R20
 0022 F001              movw R30,R0
 0024 80E0              ldi R24,<_SCH_tasks_G
 0026 90E0              ldi R25,>_SCH_tasks_G
 0028 E80F              add R30,R24
 002A F91F              adc R31,R25
 002C A081              ldd R26,z+0
 002E B181              ldd R27,z+1
 0030 FD01              movw R30,R26
 0032 0E940000          xcall xicall
 0036                   .dbline 61
 0036           ;                       
 0036           ;                       // 复位 / 降低RunMe标志
 0036           ;                       SCH_tasks_G[Index].RunMe -= 1;
 0036 87E0              ldi R24,7
 0038 849F              mul R24,R20
 003A 1001              movw R2,R0
 003C 80E0              ldi R24,<_SCH_tasks_G+6
 003E 90E0              ldi R25,>_SCH_tasks_G+6
 0040 280E              add R2,R24
 0042 391E              adc R3,R25
 0044 F101              movw R30,R2
 0046 8081              ldd R24,z+0
 0048 8150              subi R24,1
 004A 8083              std z+0,R24
 004C                   .dbline 64
 004C           ;                       
 004C           ;                       // 如果这个是'单次'任务,将它从队列中删除
 004C           ;                       if (SCH_tasks_G[Index].Period == 0)
 004C 87E0              ldi R24,7
 004E 849F              mul R24,R20
 0050 F001              movw R30,R0
 0052 80E0              ldi R24,<_SCH_tasks_G+4
 0054 90E0              ldi R25,>_SCH_tasks_G+4
 0056 E80F              add R30,R24
 0058 F91F              adc R31,R25
 005A 2080              ldd R2,z+0
 005C 3180              ldd R3,z+1
 005E 2220              tst R2
 0060 21F4              brne L13
 0062 3320              tst R3
 0064 11F4              brne L13
 0066           X0:
 0066                   .dbline 65
 0066           ;                       {
 0066                   .dbline 66
 0066           ;                               SCH_Delete_Task(Index);
 0066 042F              mov R16,R20
 0068 49D0              xcall _SCH_Delete_Task
 006A                   .dbline 67
 006A           ;                       }
 006A           L13:
 006A                   .dbline 68
 006A           ;               }
 006A           L9:
 006A                   .dbline 69
 006A           L6:
 006A                   .dbline 53
 006A 4395              inc R20
 006C           L8:
 006C                   .dbline 53
 006C 4330              cpi R20,3
 006E 08F4              brsh X1
 0070 CBCF              xjmp L5
 0072           X1:
 0072                   .dbline -2
 0072           L4:
 0072 0E940000          xcall pop_gset1
 0076                   .dbline 0 ; func end
 0076 0895              ret
 0078                   .dbsym r Index 20 c
 0078                   .dbend
 0078                   .dbfunc e SCH_Add_Task _SCH_Add_Task fc
 0078           ;          Index -> R20
 0078           ;         PERIOD -> y+2
 0078           ;          DELAY -> R18,R19
 0078           ;      pFunction -> R16,R17
                        .even
 0078           _SCH_Add_Task::
 0078 0E940000          xcall push_gset1
 007C                   .dbline -1
 007C                   .dbline 91
 007C           ;       }
 007C           ; }
 007C           ; 
 007C           ; 
 007C           ; 
 007C           ; /*---------------------------------------------------------*-
 007C           ;  * 函数名称: SCH_Add_Task()
 007C           ;  * 入  口: (*pFunction)任务指针,(DELAY)到第一次运行间隔时标,
 007C           ;  *                     (PERIOD)每次运行的间隔时标
 007C           ;  *
 007C           ;  * 出  口: 返回SCH_MAX_TASKS表示任务队列已满
 007C           ;  *                     返回(Index)=任务位置
 007C           ;  *
 007C           ;  * 函数功能: 用来添加任务到任务队列上,以保证它们在需要的时
 007C           ;  *                     候被调用
 007C           ;  * 
 007C           ;  * 说  明: 使任务函数每隔一定间隔或在用户的延迟之后执行.
 007C           ; -*---------------------------------------------------------*/
 007C           ; 
 007C           ; unsigned char SCH_Add_Task(void (*pFunction)(),       // 任务指针
 007C           ;                                                       const unsigned int DELAY,       // 延迟Delay个时标后函数将第一次运行
 007C           ;                                                       const unsigned int PERIOD)  // 连续的运行之间的间隔(时标)
 007C           ; {
 007C                   .dbline 92
 007C           ;       unsigned char Index = 0;        // 首先在队列中找到一个空隙
 007C 4427              clr R20
 007E 01C0              xjmp L18
 0080           L17:
 0080                   .dbline 95
 0080                   .dbline 96
 0080 4395              inc R20
 0082                   .dbline 97
 0082           L18:
 0082                   .dbline 94
 0082           ; 
 0082           ;       while ((SCH_tasks_G[Index].pTask != 0) && (Index < SCH_MAX_TASKS))
 0082 87E0              ldi R24,7
 0084 849F              mul R24,R20
 0086 F001              movw R30,R0
 0088 80E0              ldi R24,<_SCH_tasks_G
 008A 90E0              ldi R25,>_SCH_tasks_G
 008C E80F              add R30,R24
 008E F91F              adc R31,R25
 0090 2080              ldd R2,z+0
 0092 3180              ldd R3,z+1
 0094 2220              tst R2
 0096 11F4              brne X2
 0098 3320              tst R3
 009A 11F0              breq L20
 009C           X2:
 009C 4330              cpi R20,3
 009E 80F3              brlo L17
 00A0           L20:
 00A0                   .dbline 98
 00A0           ;       {
 00A0           ;               Index++;        
 00A0           ;       }
 00A0           ;       if (Index == SCH_MAX_TASKS)
 00A0 4330              cpi R20,3
 00A2 11F4              brne L21
 00A4                   .dbline 99
 00A4           ;       {
 00A4                   .dbline 100
 00A4           ;               return SCH_MAX_TASKS;  // 同时返回错误代码
 00A4 03E0              ldi R16,3
 00A6 27C0              xjmp L16
 00A8           L21:
 00A8                   .dbline 104
 00A8           ;       }
 00A8           ; 
 00A8           ;       // 如果能运行到这里,则说明任务队列中有空间
 00A8           ;       SCH_tasks_G[Index].pTask = pFunction;
 00A8 87E0              ldi R24,7
 00AA 849F              mul R24,R20
 00AC F001              movw R30,R0
 00AE 80E0              ldi R24,<_SCH_tasks_G
 00B0 90E0              ldi R25,>_SCH_tasks_G
 00B2 E80F              add R30,R24
 00B4 F91F              adc R31,R25
 00B6 1183              std z+1,R17
 00B8 0083              std z+0,R16
 00BA                   .dbline 105
 00BA           ;       SCH_tasks_G[Index].Delay = DELAY;
 00BA 87E0              ldi R24,7
 00BC 849F              mul R24,R20
 00BE F001              movw R30,R0
 00C0 80E0              ldi R24,<_SCH_tasks_G+2
 00C2 90E0              ldi R25,>_SCH_tasks_G+2
 00C4 E80F              add R30,R24
 00C6 F91F              adc R31,R25
 00C8 3183              std z+1,R19
 00CA 2083              std z+0,R18
 00CC                   .dbline 106
 00CC           ;       SCH_tasks_G[Index].Period = PERIOD;
 00CC 87E0              ldi R24,7
 00CE 849F              mul R24,R20
 00D0 F001              movw R30,R0
 00D2 80E0              ldi R24,<_SCH_tasks_G+4
 00D4 90E0              ldi R25,>_SCH_tasks_G+4
 00D6 E80F              add R30,R24

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -