📄 os_cpu_c.lst
字号:
193 * 参数 : 无
194 *
195 * 注意 : 1) 调用期间中断被禁止
196 * 2) 假定全局指针'OSTCBHighRdy'已经指向了将要被换入的任务控制块(即:最高优先级任务),并且
197 * 'OSTCBCur'指向了将被换出的任务(即:当前任务)。
198 *********************************************************************************************************
199 */
200 void OSTaskSwHook (void) reentrant
201 {
202 1 INT16U time;
203 1 TASK_USER_DATA *puser;
204 1
205 1
206 1 time = C51_ElapsedStop(); /* This task is done */
207 1 C51_ElapsedStart(); /* Start for next task */
208 1
209 1 puser = (TASK_USER_DATA*)OSTCBCur->OSTCBExtPtr; /* Point to used data */
210 1
211 1 if (puser != (TASK_USER_DATA *)0) {
212 2 puser->TaskCtr++; /* Increment task counter */
213 2 puser->TaskExecTime = time; /* Update the task's execution time */
214 2 puser->TaskTotExecTime += time; /* Update the task's total execution time */
215 2 }
216 1 }
217
218 /*
219 *********************************************************************************************************
220 * 统计任务钩挂函数
221 *
222 * 描述 : 这个函数每秒钟被uC/OS-II统计任务调用。这么做使你的应用程序可以增加统计任务的功能。
223 *
224 * 注意 : 无
225 *********************************************************************************************************
226 */
227 #if OS_TASK_STAT_EN > 0
228 extern TASK_USER_DATA TaskUserData[7];
229 void OSTaskStatHook (void) reentrant
230 {
231 1 INT8U i;
232 1 INT32U total;
233 1 INT32U pct;
234 1 OSSchedLock();
235 1
236 1 total = 0; /* Totalize TOT. EXEC. TIME for each task */
237 1 for (i = 0; i < 7; i++) {
238 2 total += (INT32U)TaskUserData[i].TaskTotExecTime;
239 2
C51 COMPILER V8.08 OS_CPU_C 08/19/2008 10:59:08 PAGE 5
240 2 LCD_Print(0,i+4,0,"%5s",TaskUserData[i].TaskName);
241 2 LCD_Print(7,i+4,0,"%5d",TaskUserData[i].TaskCtr);
242 2 LCD_Print(13,i+4,0,"%5d",TaskUserData[i].TaskExecTime);
243 2 LCD_Print(19,i+4,0,"%5d",TaskUserData[i].TaskTotExecTime);
244 2 }
245 1 // if (total > 0) {
246 1 for (i = 0; i < 7; i++) { /* Derive percentage of each task */
247 2 pct = 100 * (INT32U)TaskUserData[i].TaskTotExecTime;
248 2 pct = pct/total;
249 2 LCD_Print(25,i+4,0,"%3d%%",(INT16U)pct);
250 2 }
251 1 // }
252 1 if (total >65535) { /* Reset total time counters at 1 billion */
253 2 for (i = 0; i < 7; i++) {
254 3 TaskUserData[i].TaskTotExecTime = 0L;
255 3 }
256 2 }
257 1 OSSchedUnlock();
258 1 }
259 #endif
260
261 /*
262 *********************************************************************************************************
263 * OSTCBInit() HOOK
264 *
265 * Description: This function is called by OSTCBInit() after setting up most of the TCB.
266 *
267 * Arguments : ptcb is a pointer to the TCB of the task being created.
268 *
269 * Note(s) : 1) Interrupts may or may not be ENABLED during this call.
270 *********************************************************************************************************
271 */
272 #if OS_VERSION > 203
273 void OSTCBInitHook (OS_TCB *ptcb) reentrant
274 {
275 1 ptcb = ptcb; /* Prevent Compiler warning */
276 1 }
277 #endif
278
279 /*
280 *********************************************************************************************************
281 * 定时钩挂函数
282 *
283 * 描述 : 本函数每一滴答被调用一次。
284 *
285 * 参数 : 无
286 *
287 * 注意 : 1) 在本调用期间中断可以或不可以使能。
288 *********************************************************************************************************
289 */
290 void OSTimeTickHook (void) reentrant
291 {
292 1 }
293
294 /*
295 *********************************************************************************************************
296 * IDLE TASK HOOK
297 *
298 * Description: This function is called by the idle task. This hook has been added to allow you to do
299 * such things as STOP the CPU to conserve power.
300 *
301 * Arguments : none
C51 COMPILER V8.08 OS_CPU_C 08/19/2008 10:59:08 PAGE 6
302 *
303 * Note(s) : 1) Interrupts are enabled during this call.
304 *********************************************************************************************************
305 */
306 #if OS_VERSION >= 251
307 void OSTaskIdleHook (void) reentrant
308 {
309 1 }
310 #endif
311
312 #endif
313
314 /*
315 使用C语言的中断处理函数有助与提高程序的移植性。建议中断程序不要太长,如果长则使用信号量来与任务同步,
316 在外部任务中实现大量的处理。
317 中断处理例程都放在下面。
318 */
319
320 void UserTickTimer(void)
321 {
322 1 TH0=0x70; //普通51定时器方式1,必须在发生中断时,重新赋值并再次启动计时
323 1 TL0=0; //Tick=50次/秒(即0.02秒/次),晶振22.1184M
324 1 TR0=1;
325 1 }
326
327 /*
328 ucOS-II系统时钟中断处理程序
329 */
330 extern xdata int TickCount;
331
332 void OSTickISR(void) interrupt 1
333 {
334 1 OSIntEnter(); // Must be called first at every hardware interrupt entry point
335 1 UserTickTimer(); // User functions can be called here.
336 1 OSTimeTick(); // Must be called during tick isr
337 1 OSIntExit(); // Must be called finally at every hardware interupt exit point
338 1 }
339
340 void T1_ISR(void) interrupt 3
341 {
342 1
343 1 OSIntEnter(); // Must be called first at every hardware interrupt entry point
344 1 TickCount++;
345 1 TH1 = 0xfd; //定义Tick=50次/秒(即0.02秒/次),TH,TL值与CPU的频率有关(22.1184M)
346 1 TL1 = 0xe0; //OS_CPU_C.C中定时器中断响应也要设置,OS_CFG.H中OS_TICKS_PER_SEC也有关系
347 1 TR1 = 1;
348 1 OSIntExit(); // Must be called finally at every hardware interupt exit point
349 1 }
350
351
352 /*
353 设置硬件寄存器的初始值。
354 初始化定时器0,作为ucOS-II的系统时钟。
355 还有其他的与硬件相关的初始化也可以放在这里。
356 */
357
358
359 //串口初始化 0xfd=19200,0xfa=9600,0xf4=4800,0xe8=2400,0xd0=1200
360 void InitHardware(void) reentrant
361 {
362 1 TMOD = 0x11; //定时器0:模式1(16位定时器),仅受TR0控制;定时器1:波特率发生器
363 1 TH0 = 0x70; //定义Tick=50次/秒(即0.02秒/次),TH,TL值与CPU的频率有关(22.1184M)
C51 COMPILER V8.08 OS_CPU_C 08/19/2008 10:59:08 PAGE 7
364 1 TL0 = 0x00; //OS_CPU_C.C中定时器中断响应也要设置,OS_CFG.H中OS_TICKS_PER_SEC也有关系
365 1 //ET0 = 1; //允许T0中断(在第一个任务开始执行时才开时钟中断,否则万一中断系统进入不可知状态)
366 1 TR0 = 0;
367 1 ET0=0; //开时钟节拍中断
368 1 EA=0;
369 1 TH1 = 0xfd; //定义Tick=50次/秒(即0.02秒/次),TH,TL值与CPU的频率有关(22.1184M)
370 1 TL1 = 0xe0; //OS_CPU_C.C中定时器中断响应也要设置,OS_CFG.H中OS_TICKS_PER_SEC也有关系
371 1 //ET0 = 1; //允许T0中断(在第一个任务开始执行时才开时钟中断,否则万一中断系统进入不可知状态)
372 1 TR1 = 0;
373 1 ET1=0; //开时钟节拍中断
374 1 }
375
376
MODULE INFORMATION: STATIC OVERLAYABLE
CODE SIZE = 1759 ----
CONSTANT SIZE = 14 ----
XDATA SIZE = ---- ----
PDATA SIZE = ---- ----
DATA SIZE = ---- ----
IDATA SIZE = ---- ----
BIT SIZE = ---- ----
EDATA SIZE = ---- ----
HDATA SIZE = ---- ----
XDATA CONST SIZE = ---- ----
FAR CONST SIZE = ---- ----
END OF MODULE INFORMATION.
C51 COMPILATION COMPLETE. 0 WARNING(S), 0 ERROR(S)
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -