OS_CPU_C.lst
资源名称:QFI4ddQe.rar [点击查看]
上传用户:tzjinxin1
上传日期:2022-08-08
资源大小:272k
文件大小:20k
源码类别:
嵌入式/单片机编程
开发平台:
Visual C++
- C51 COMPILER V8.02 OS_CPU_C 06/22/2006 12:13:15 PAGE 1
- C51 COMPILER V8.02, COMPILATION OF MODULE OS_CPU_C
- OBJECT MODULE PLACED IN uCosiiOS_CPU_C.OBJ
- COMPILER INVOKED BY: C:KeilC51BINC51.EXE uCosiiOS_CPU_C.C LARGE BROWSE DEBUG OBJECTEXTEND PRINT(.lstOS_CPU_C.lst)
- - SRC(.objOS_CPU_C.SRC)
- line level source
- 1 /*
- 2 *********************************************************************************************************
- 3 * uC/OS-II
- 4 * 实时内核
- 5 *
- 6 * (c) Copyright 1992-1998, Jean J. Labrosse, Plantation, FL
- 7 * 版权所有
- 8 *
- 9 * MCU-51 专用代码
- 10 * KEIL C51大模式编译
- 11 *
- 12 * 文件名 : OS_CPU_C.C
- 13 * 作者 : Jean J. Labrosse
- 14 * 改编 : 杨屹 gdtyy@ri.gdt.com.cn 巨龙公司系统集成开发部 2002.09.27
- 15 * 改编 : 钟文青,升级到与ucOS-II 2.51的代码,2003.5
- 16 *********************************************************************************************************
- 17 */
- 18
- 19 #define OS_CPU_GLOBALS
- 20 #include "sourceincludes.h"
- 21
- 22 /*
- 23 *********************************************************************************************************
- 24 * 初始化任务堆栈
- 25 *
- 26 * 描述 : 这个函数被OSTaskCreate()或OSTaskCreateExt()调用,以便初始化新创建任务的堆栈结构。本函数
- 27 * 与处理器高度相关。
- 28 *
- 29 * 参数 : task 指向任务代码的指针
- 30 *
- 31 * pdata 当任务第一次执行时将要传入任务的用户数据结构指针
- 32 *
- 33 * ptos 栈顶指针。ptos指针被默认为用户堆栈入口指针。如果OS_STK_GROWTH被置1,那么,
- 34 * ptos指向用户堆栈的最高有效地址。同样地,如果OS_STK_GROWTH清0,ptos将指向
- 35 * 用户堆栈的最低有效地址。
- 36 *
- 37 * opt 指定可以改变OSTaskStkInit()行为的选项。(见uCOS_II.H for OS_TASK_OPT_???)。
- 38 *
- 39 * 返回值 : 我修改了原来的程序,使函数总是返回用户堆栈空间的最低有效地址。这样修改提高了TCB换入换出
- 40 * 的效率。
- 41 *
- 42 * 注意 : 任务堆栈结构:
- 43 *
- 44 * ---------- -
- 45 * 用户栈最高地址---->| | |
- 46 * ---------- |
- 47 * | ... | 仿真堆栈空间
- 48 *---------- ---------- | 每任务一个
- 49 *|OSTCBCur| ?C_XBP---->| | | KEIL自动处理
- 50 *---------- ---------- -
- 51 * | |空闲间隔|
- 52 * | ----------------------- ---------- ----------
- 53 * ---->|OSTCBCur->OSTCBStkPtr| |?C_XBP低| SP---->| |
- 54 * ----------------------- ---------- ----------
- C51 COMPILER V8.02 OS_CPU_C 06/22/2006 12:13:15 PAGE 2
- 55 * | |?C_XBP高| | |
- 56 * | ---------- - ----------
- 57 * | | | | | . |
- 58 * | ---------- | | . |
- 59 * | | | | | . |
- 60 * | ---------- | ----------
- 61 * | | . |长度 | | +1
- 62 * | | . | | ----------
- 63 * | | . | | OSStack---->| | 0
- 64 * | ---------- | ----------
- 65 * | | | | OSStkStart---->| 不关心 | -1 低地址
- 66 * | ---------- - ----------
- 67 * ------------->| 长度 | 低地址 系统硬件堆栈
- 68 * ----------
- 69 * 用户堆栈 长度=SP-OSStkStart
- 70 *********************************************************************************************************
- 71 */
- 72
- 73 OS_STK *OSTaskStkInit (void (*task)(void *pd) reentrant, void *ppdata, OS_STK *ptos, INT16U opt) reentrant
- 74 {
- 75 1 OS_STK *stk;
- 76 1
- 77 1 ppdata = ppdata;
- 78 1 opt = opt; //opt没被用到,保留此语句防止告警产生
- 79 1 stk = ptos; //用户堆栈最低有效地址
- 80 1 *stk++ = 15; //用户堆栈长度
- 81 1 *stk++ = (INT16U)task & 0xFF; //任务地址低8位
- 82 1 *stk++ = (INT16U)task >> 8; //任务地址高8位
- 83 1 *stk++ = 0x0A; //ACC
- 84 1 *stk++ = 0x0B; //B
- 85 1 *stk++ = 0x00; //DPH
- 86 1 *stk++ = 0x00; //DPL
- 87 1 *stk++ = 0x00; //PSW
- 88 1 *stk++ = 0x00; //R0
- 89 1
- 90 1 //R3、R2、R1用于传递任务参数ppdata,其中R3代表存储器类型,R2为高字节偏移,R1为低字节位移。
- 91 1 //通过分析KEIL汇编,了解到任务的void *ppdata参数恰好是用R3、R2、R1传递,不是通过虚拟堆栈。
- 92 1 *stk++ = (INT16U)ppdata & 0xFF; //R1
- 93 1 *stk++ = (INT16U)ppdata >> 8; //R2
- 94 1 *stk++ = 0x01; //R3 因为我用的全是XDATA,所以存储器类型固定为1,见C51.PD
- -F第178页说明。
- 95 1
- 96 1 *stk++ = 0x04; //R4
- 97 1 *stk++ = 0x05; //R5
- 98 1 *stk++ = 0x06; //R6
- 99 1 *stk++ = 0x07; //R7
- 100 1 //不用保存SP,任务切换时根据用户堆栈长度计算得出。
- 101 1 *stk++ = (INT16U) (ptos+MaxStkSize) >> 8; //?C_XBP 仿真堆栈指针高8位
- 102 1 *stk++ = (INT16U) (ptos+MaxStkSize) & 0xFF; //?C_XBP 仿真堆栈指针低8位
- 103 1
- 104 1 return ((void *)ptos);
- 105 1 }
- 106
- 107 #if OS_CPU_HOOKS_EN
- 108
- 109 /*
- 110 *********************************************************************************************************
- 111 * OS INITIALIZATION HOOK
- 112 * (BEGINNING)
- 113 *
- 114 * Description: This function is called by OSInit() at the beginning of OSInit().
- 115 *
- C51 COMPILER V8.02 OS_CPU_C 06/22/2006 12:13:15 PAGE 3
- 116 * Arguments : none
- 117 *
- 118 * Note(s) : 1) Interrupts should be disabled during this call.
- 119 *********************************************************************************************************
- 120 */
- 121 #if OS_VERSION > 203
- 122 void OSInitHookBegin (void) reentrant
- 123 {
- 124 1
- 125 1 }
- 126 #endif
- 127
- 128 /*
- 129 *********************************************************************************************************
- 130 * OS INITIALIZATION HOOK
- 131 * (END)
- 132 *
- 133 * Description: This function is called by OSInit() at the end of OSInit().
- 134 *
- 135 * Arguments : none
- 136 *
- 137 * Note(s) : 1) Interrupts should be disabled during this call.
- 138 *********************************************************************************************************
- 139 */
- 140 #if OS_VERSION > 203
- 141 void OSInitHookEnd (void) reentrant
- 142 {
- 143 1 }
- 144 #endif
- 145
- 146 /*
- 147 *********************************************************************************************************
- 148 * 任务创建钩挂函数
- 149 *
- 150 * 描述 : 任务创建时调用
- 151 *
- 152 * 参数 : ptcb是指向将被创建任务的任务控制块的指针。
- 153 *
- 154 * 注意 : 1) 调用期间中断被禁止
- 155 *********************************************************************************************************
- 156 */
- 157 void OSTaskCreateHook (OS_TCB *ptcb) reentrant
- 158 {
- 159 1 ptcb = ptcb; /* Prevent compiler warning */
- 160 1 }
- 161
- 162
- 163 /*
- 164 *********************************************************************************************************
- 165 * 任务删除钩挂函数
- 166 *
- 167 * 描述 : 任务删除时调用
- 168 *
- 169 * 参数 : ptcb是指向将被删除任务的任务控制块的指针。
- 170 *
- 171 * 注意 : 1) 调用期间中断被禁止
- 172 *********************************************************************************************************
- 173 */
- 174 #if OS_TASK_DEL_EN > 0
- void OSTaskDelHook (OS_TCB *ptcb) reentrant
- {
- ptcb = ptcb; /* Prevent compiler warning */
- C51 COMPILER V8.02 OS_CPU_C 06/22/2006 12:13:15 PAGE 4
- }
- #endif
- 180
- 181 /*
- 182 *********************************************************************************************************
- 183 * 任务切换钩挂函数
- 184 *
- 185 * 描述 : 执行任务切换时调用。这允许你在上下文切换期间执行其它操作。
- 186 *
- 187 * 参数 : 无
- 188 *
- 189 * 注意 : 1) 调用期间中断被禁止
- 190 * 2) 假定全局指针'OSTCBHighRdy'已经指向了将要被换入的任务控制块(即:最高优先级任务),并且
- 191 * 'OSTCBCur'指向了将被换出的任务(即:当前任务)。
- 192 *********************************************************************************************************
- 193 */
- 194 void OSTaskSwHook (void) reentrant
- 195 {
- 196 1 }
- 197
- 198 /*
- 199 *********************************************************************************************************
- 200 * 统计任务钩挂函数
- 201 *
- 202 * 描述 : 这个函数每秒钟被uC/OS-II统计任务调用。这么做使你的应用程序可以增加统计任务的功能。
- 203 *
- 204 * 注意 : 无
- 205 *********************************************************************************************************
- 206 */
- 207 #if OS_TASK_STAT_EN > 0
- void OSTaskStatHook (void) reentrant
- {
- }
- #endif
- 212
- 213 /*
- 214 *********************************************************************************************************
- 215 * OSTCBInit() HOOK
- 216 *
- 217 * Description: This function is called by OSTCBInit() after setting up most of the TCB.
- 218 *
- 219 * Arguments : ptcb is a pointer to the TCB of the task being created.
- 220 *
- 221 * Note(s) : 1) Interrupts may or may not be ENABLED during this call.
- 222 *********************************************************************************************************
- 223 */
- 224 #if OS_VERSION > 203
- 225 void OSTCBInitHook (OS_TCB *ptcb) reentrant
- 226 {
- 227 1 ptcb = ptcb; /* Prevent Compiler warning */
- 228 1 }
- 229 #endif
- 230
- 231 /*
- 232 *********************************************************************************************************
- 233 * 定时钩挂函数
- 234 *
- 235 * 描述 : 本函数每一滴答被调用一次。
- 236 *
- 237 * 参数 : 无
- 238 *
- 239 * 注意 : 1) 在本调用期间中断可以或不可以使能。
- C51 COMPILER V8.02 OS_CPU_C 06/22/2006 12:13:15 PAGE 5
- 240 *********************************************************************************************************
- 241 */
- 242 void OSTimeTickHook (void) reentrant
- 243 {
- 244 1 }
- 245
- 246 /*
- 247 *********************************************************************************************************
- 248 * IDLE TASK HOOK
- 249 *
- 250 * Description: This function is called by the idle task. This hook has been added to allow you to do
- 251 * such things as STOP the CPU to conserve power.
- 252 *
- 253 * Arguments : none
- 254 *
- 255 * Note(s) : 1) Interrupts are enabled during this call.
- 256 *********************************************************************************************************
- 257 */
- 258 #if OS_VERSION >= 251
- 259 void OSTaskIdleHook (void) reentrant
- 260 {
- 261 1 }
- 262 #endif
- 263
- 264 #endif
- 265
- 266 /*
- 267 使用C语言的中断处理函数有助与提高程序的移植性。建议中断程序不要太长,如果长则使用信号量来与任务同步,
- 268 在外部任务中实现大量的处理。
- 269 中断处理例程都放在下面。
- 270 */
- 271
- 272 void UserTickTimer(void)
- 273 {
- 274 1 TH0=0x70; //普通51定时器方式1,必须在发生中断时,重新赋值并再次启动计时
- 275 1 TL0=0; //Tick=50次/秒(即0.02秒/次),晶振22.1184M
- 276 1 TR0=1;
- 277 1 }
- 278
- 279 /*
- 280 ucOS-II系统时钟中断处理程序
- 281 */
- 282 void OSTickISR(void) interrupt 1
- 283 {
- 284 1 OSIntEnter(); // Must be called first at every hardware interrupt entry point
- 285 1 UserTickTimer(); // User functions can be called here.
- 286 1 OSTimeTick(); // Must be called during tick isr
- 287 1 OSIntExit(); // Must be called finally at every hardware interupt exit point
- 288 1 }
- 289
- 290 /*--------------------------------------------------------------*/
- 291 /* ucOS-II的中断服务程序示例 */
- 292 /*--------------------------------------------------------------*/
- 293 #include "sourceserial.h"
- 294
- 295 void SerialISR(void) interrupt 4
- 296 {
- 297 1 #if OS_CRITICAL_METHOD == 3 // Allocate storage for CPU status register
- OS_CPU_SR cpu_sr;
- #endif
- 300 1
- 301 1 OSIntEnter(); // Must be called first at every hardware interrupt entry point
- C51 COMPILER V8.02 OS_CPU_C 06/22/2006 12:13:15 PAGE 6
- 302 1 OS_ENTER_CRITICAL();
- 303 1 if(TI)
- 304 1 {
- 305 2 TI=0;
- 306 2 pc_send.ptr++;
- 307 2 if (pc_send.ptr < pc_send.count)
- 308 2 SBUF=pc_send.buffer[pc_send.ptr];
- 309 2 }
- 310 1 else if(RI)
- 311 1 {
- 312 2 RI=0;
- 313 2 //处理输入字符
- 314 2 }
- 315 1 OS_EXIT_CRITICAL();
- 316 1
- 317 1 OSIntExit(); // Must be called finally at every hardware interupt exit point
- 318 1 }
- 319
- 320
- 321 /*
- 322 设置硬件寄存器的初始值。
- 323 初始化定时器0,作为ucOS-II的系统时钟。
- 324 还有其他的与硬件相关的初始化也可以放在这里。
- 325 */
- 326
- 327 //串口初始化 0xfd=19200,0xfa=9600,0xf4=4800,0xe8=2400,0xd0=1200
- 328 void InitHardware(void) reentrant
- 329 {
- 330 1 TMOD = 0x21; //定时器0:模式1(16位定时器),仅受TR0控制;定时器1:波特率发生器
- 331 1 TH0 = 0x70; //定义Tick=50次/秒(即0.02秒/次),TH,TL值与CPU的频率有关(22.1184M)
- 332 1 TL0 = 0x00; //OS_CPU_C.C中定时器中断响应也要设置,OS_CFG.H中OS_TICKS_PER_SEC也有关系
- 333 1 //ET0 = 1; //允许T0中断(在第一个任务开始执行时才开时钟中断,否则万一中断系统进入不可知状态)
- 334 1 TR0 = 1;
- 335 1
- 336 1 TH1 = 0xFA; //晶振22.1084, 波特率 9600
- 337 1 ET1 = 0;
- 338 1 TR1 = 1; //start timer1
- 339 1 SCON = 0x50;
- 340 1 ES = 1;
- 341 1
- 342 1 //设置串口收发的初始值
- 343 1 pc_send.ptr=0;
- 344 1 pc_send.count=0;
- 345 1 ET0=1; //开时钟节拍中断
- 346 1 }
- MODULE INFORMATION: STATIC OVERLAYABLE
- CODE SIZE = 963 ----
- CONSTANT SIZE = ---- ----
- XDATA SIZE = 7 ----
- PDATA SIZE = ---- ----
- DATA SIZE = ---- ----
- IDATA SIZE = ---- ----
- BIT SIZE = ---- ----
- END OF MODULE INFORMATION.
- C51 COMPILATION COMPLETE. 0 WARNING(S), 0 ERROR(S)