亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频

? 歡迎來到蟲蟲下載站! | ?? 資源下載 ?? 資源專輯 ?? 關于我們
? 蟲蟲下載站

?? os_cpu_c.c

?? ucos-ii在80c52的實施指南與實例
?? C
字號:
// os_cpu_c.c 
//
// Port of uC/OS-II (C) to the Intel 80x86 (32-bit flat protected mode)
// By Jean L. Gareau (jean.gareau@exposecorp.com)
//
// Copyright (C) 1997-1999, Jean L. Gareau. All rights reserved. 
// This file or its content can not be used for commercial applications 
// without the prior written permission of the author.
//
// Description:
//	This file contains the C routines of the port (see Ix86pm_a.asm for the
//	assembly language routines). A full description of the port can be found
//	in Port86pm.doc.
//
// Development Environment:
//	This file has been developed within a Visual C++ 5.0 project. Otherwise, 
 //	it can be compiled using the following command:
//
//		CL /ML /W3 /GX /O2 /FD /c [/D_DEBUG] Ix86p.c
//
//  The macro _DEBUG can be enabled to dump the stack of unexpected interrupts, 
//	as in: #define _DEBUG. Note that Ix86p_a.asm must also be assembled with
//	_DEBUG defined as well.
//
// Versions:
//	1.00 14-Dec-97	Initial release.
//	2.00 28-Feb-99	Upgrade from uC/OS to uC/OS-II

#include "os_cpu.h"
#include "os_cfg.h"
#include "ucos_ii.h"

#ifdef _DEBUG
#include <stdlib.h>						// for itoa()
#endif

// Intel 8259 ports
#define I8259_A0	0x020				// 8259 #1, port #1
#define I8259_A1	0x021				// 8259 #1, port #2
#define I8259_B0	0x0a0				// 8259 #2, port #1
#define I8259_B1	0x0a1				// 8259 #2, port #2

// Prototypes
static void InitA20();
static void InitPIC();
static void SetIntVector(int IntNo, PTR Handler);
static void SetIDTGate(int IntNo, INT16U Type, INT16U Selector, INT32U Offset);
static void TaskBucket();

#ifdef _DEBUG
extern void OnScreen(int x, int y, char * pszText, int nColor);
#endif

///////////////////////////////////////////////////////////////////////////////
// uCOS-II Functions

// OSCpuInit()
// Performs CPU-dependent intiailization.

void OSCpuInit()
{
	int	IntNo;

	InitA20();								// Enable address line 20
	InitPIC();								// Relocate IRQs to 0x20-0x2F

	// Install a default handler for all supported interrupts:
	//	a) 0x00-0x1F: Intel-reserved
	//	b) 0x20-0x2F: IRQ (relocated)
	//	c) 0x30-0x3F: Available for uCOS and application.

	for (IntNo = 0; IntNo < 0x40; IntNo++)
		SetIntVector(IntNo, DefIntHandler);

#ifdef _DEBUG
	// Install a dump stack handler for int 13 (General Protection Fault).
	SetIntVector(13, DumpStackHandler);
#endif

	SetIntVector(0x20, OSTickISR);			// Install the tick handler 
	SetIntVector(uCOS, OSCtxSw);			// Install uCOS-II's context switch handler
}

// OSTaskStkInit()
// This is a uCOS-II function. Only the stack setup part needs some modifications.

void * OSTaskStkInit(void (*task)(void *pd), void *pdata, void *ptos, INT16U opt)
{
	OS_STK*	stk;

	stk = (OS_STK *) ptos;			// Load stack pointer

	*--stk = (INT32U) pdata;			// Simulate a function call (to pass the parameter)
	*--stk = (INT32U) TaskBucket;	// Return address in case the task exits.

	*--stk = 0x00000202;			// Eflags (interrupt flag enabled)
	*--stk = CS_SELECTOR;			// CS
	*--stk = (INT32U) task;			// Entry point

	*--stk = 0;						// EAX
	*--stk = 0;						// ECX
	*--stk = 0;						// EDX
	*--stk = 0;						// EBX
	*--stk = 0;						// ESP (unused)
	*--stk = 0;						// EBP
	*--stk = 0;						// ESI
	*--stk = 0;						// EDI

    return stk;
}

// OSTaskCreateHook
// This hook is invoked during task creation.

void OSTaskCreateHook(OS_TCB * pTcb)
{
}

// OSTaskDelHook
// This hook is invoked during task deletion.

void OSTaskDelHook(OS_TCB * pTcb)
{
}

// OSTaskSwHook
// This hook is invoked during a task switch.
// OSTCBCur points to the current task (being switched out).
// OSTCBHighRdy points on the new task (being switched in).

void OSTaskSwHook()
{
}

// OSTaskStatHook
// This hook is invoked by the statistical task every second.

void OSTaskStatHook()
{
}

// OSTimeTickHook
// This hook is invoked during a time tick.

void OSTimeTickHook()
{
}

///////////////////////////////////////////////////////////////////////////////
// Helper Functions

// InitA20. 
// Enable the address line 20.
//
// The address line 20 must be under the control of the CPU (not always 0 as it is 
// in real-mode). This is done by sending commands to the keyboard controller (i8042). 
// Before sending commands, the i8042 must be polled to ensure that it can receive data.

void InitA20()
{
	INT8U	status;

	// Wait until i8042 can receive the command.
	do 
	{
		status = inportb(0x64);
	} while (status & 2);

	// Send the 'write' command to the i8042.
	outportb(0x64, 0xd1);

	// Wait until i8042 can receive the command.
	do 
	{
		status = inportb(0x64);
	} while (status & 2);

	// Send the new set-up.
	outportb(0x60, 0xdf);

	// Wait until i8042 has received the command.
	do 
	{
		status = inportb(0x64);
	} while (status & 2);
}

// InitPIC()
// Relocate the IRQ lanes from 0x00 to 0x20 to prevent conflicts 
// between IRQ and CPU's exceptions.
//
// This is achieved by sending a series of command to the Intel 8259 
// Programmable Interrupt Controllers (PIC).

void InitPIC()
{
	// Reprogram the master 8259.
	outportb(I8259_A0, 0x11);

	outportb(I8259_A1, 0x20);
	outportb(I8259_A1, 0x04);
	outportb(I8259_A1, 0x01);
	outportb(I8259_A1, 0x00);

	// Reprogram the slave 8259.
	outportb(I8259_B0, 0x11);

	outportb(I8259_B1, 0x28);
	outportb(I8259_B1, 0x02);
	outportb(I8259_B1, 0x01);
	outportb(I8259_B1, 0x00);
}

// SetIntVector()
// Installs an interrupt handler.
 
void SetIntVector(int IntNo, PTR Offset)
{
	SetIDTGate(IntNo, IDTDATE_INT, CS_SELECTOR, (INT32U) Offset);
}

// SetIDTGate()
// Install a generic gate in the IDT.
//
// Parameters:
//	IntNo   : The IDT entry no (0x00-0x3F)
//	Type    : IDTGATE_INT, IDTGATE_TRAP or IDTGATE_TASK
//	Selector: Code selector, usually CS_SELECTOR
//	Offset  : Handler

void SetIDTGate(int IntNo, INT16U Type, INT16U Selector, INT32U Offset)
{
	extern IDT_GATE	Idt[];

	IDT_GATE *	pGate = &Idt[IntNo];

	pGate->Offset   = (INT16U) (Offset & 0xffff);
	pGate->Offset2  = (INT16U) (Offset >> 16);
	pGate->Selector = Selector;
	pGate->Type     = Type;
}

// TaskBucket()
// This is the function that is executed if a task inadvertedly
// returns from its main function. This is specified in OSTaskStkInit(),
// when a task's stack is being intialized.

void TaskBucket()
{
	while (1)
		;
}

// ShowRegister()
// A simple debug function that shows a INT32U, starting from the
// top left corner of the screen and going down each time it is invoked.
// It thus works 25 times for a 25-line monitor. It is useful to dump
// a few DWORDs from the stack at a given point (particularly during faults).
// Not sophisticated, but useful.

#ifdef _DEBUG
void ShowRegister(INT32U v)
{
	static int	i = 0;
	char	buffer[32];

	itoa(v, buffer, 16);

	OnScreen(0, i++, buffer, 14);
}
#endif

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
麻豆一区二区在线| 日韩二区三区四区| 精品久久久久久久一区二区蜜臀| 色婷婷精品大在线视频| 99精品视频一区| 播五月开心婷婷综合| 99riav久久精品riav| 91免费观看在线| 欧美四级电影网| 欧美一区二区黄色| 亚洲精品一区二区三区蜜桃下载| 久久婷婷久久一区二区三区| 久久蜜桃av一区二区天堂 | 日韩免费福利电影在线观看| 欧美一级在线视频| 欧美精品一区二区三区蜜桃| 国产欧美日本一区二区三区| 国产精品国产a| 亚洲一区二区精品3399| 免费观看一级欧美片| 国产成人精品亚洲午夜麻豆| 国产91对白在线观看九色| 99精品偷自拍| 欧美一区二区在线播放| 久久先锋影音av鲁色资源网| 国产精品国产三级国产| 水蜜桃久久夜色精品一区的特点| 蜜臀av国产精品久久久久| 国产乱码精品一区二区三区av | 94-欧美-setu| 欧美狂野另类xxxxoooo| 久久丝袜美腿综合| 亚洲日本免费电影| 麻豆精品视频在线观看| 97se亚洲国产综合自在线| 欧美精品高清视频| 中文字幕免费不卡| 日韩av一二三| 99国产精品久久久久| 日韩欧美在线一区二区三区| 国产精品视频麻豆| 日韩和的一区二区| 91亚洲永久精品| 欧美大胆一级视频| 一区二区免费在线播放| 国产麻豆精品视频| 69精品人人人人| 一区二区三区精品视频| 国产激情视频一区二区在线观看| 欧美午夜精品一区二区三区| 欧美韩国一区二区| 狠狠色丁香婷婷综合久久片| 欧美日韩中字一区| 亚洲欧美日韩一区二区三区在线观看| 久久99久国产精品黄毛片色诱| 欧美综合视频在线观看| 国产精品久久久久三级| 国产在线视视频有精品| 欧美精品v国产精品v日韩精品| 亚洲视频图片小说| eeuss鲁片一区二区三区在线看| 欧美成人激情免费网| 亚洲国产精品精华液网站| 91最新地址在线播放| 欧美高清在线一区| 高清久久久久久| 久久久无码精品亚洲日韩按摩| 奇米影视在线99精品| 精品视频免费在线| 一区二区视频在线看| 91影院在线观看| 亚洲精品免费一二三区| 99久久综合狠狠综合久久| 欧美激情一区在线| 国产成人av电影免费在线观看| 久久久久国产精品人| 国内国产精品久久| 精品免费视频.| 经典一区二区三区| 久久综合九色综合欧美98| 国内精品嫩模私拍在线| 国产色产综合产在线视频| 国产精品一区二区在线播放| 国产亚洲精品精华液| 国产美女娇喘av呻吟久久| 久久久精品影视| 成人午夜电影网站| 综合av第一页| 欧美写真视频网站| 欧美aⅴ一区二区三区视频| 日韩网站在线看片你懂的| 精品影院一区二区久久久| 精品国产1区二区| 成人免费看片app下载| 国产精品国产三级国产| 欧美日韩精品一二三区| 久久99久久久久久久久久久| 欧美激情中文字幕一区二区| 日本二三区不卡| 另类的小说在线视频另类成人小视频在线| 美女一区二区在线观看| 精品美女在线播放| 色综合一个色综合| 亚洲曰韩产成在线| 欧美日本一区二区在线观看| 久久精品国产秦先生| 国产片一区二区| 欧美无砖专区一中文字| 美日韩一级片在线观看| 国产精品国产成人国产三级| 欧美日韩一区中文字幕| 国产成人亚洲综合a∨猫咪| 亚洲一区二区五区| 欧美成人aa大片| 色综合色狠狠综合色| 久久精品国产精品亚洲红杏| 最新高清无码专区| 欧美成人精品3d动漫h| 色综合视频在线观看| 国内精品久久久久影院薰衣草| 亚洲男人电影天堂| 久久久亚洲精品石原莉奈| 欧美三级日韩在线| av不卡一区二区三区| 狠狠色综合日日| 男女男精品视频| 一区二区三区精品在线观看| 国产欧美日韩在线观看| 4438成人网| 欧美亚洲国产bt| 99久久免费精品高清特色大片| 另类小说综合欧美亚洲| 亚洲成人动漫在线观看| 亚洲免费av高清| 国产精品久久久久久久裸模| 欧美成人a∨高清免费观看| 欧美日韩免费一区二区三区视频 | 国产精品伦一区| 欧美www视频| 日韩一区国产二区欧美三区| 欧美日韩黄色一区二区| 色婷婷av一区二区三区软件| 国产 欧美在线| 成人免费视频一区| 国产激情一区二区三区四区| 激情av综合网| 麻豆精品在线看| 免费美女久久99| 免费精品视频在线| 久久精品国产99国产精品| 人禽交欧美网站| 日韩av不卡在线观看| 日韩电影网1区2区| 奇米影视在线99精品| 美腿丝袜在线亚洲一区| 美女一区二区三区在线观看| 蜜臀av性久久久久蜜臀aⅴ流畅 | 久久九九全国免费| 精品国产a毛片| 久久久av毛片精品| 久久精品视频一区二区| 国产精品丝袜91| 亚洲欧洲av另类| 一区二区三国产精华液| 石原莉奈一区二区三区在线观看| 日韩黄色在线观看| 久久成人麻豆午夜电影| 国产在线乱码一区二区三区| 国产电影一区二区三区| 成人小视频在线| 99re这里只有精品视频首页| 欧美体内she精高潮| 日韩免费电影一区| 欧美国产精品v| 一区二区三区日韩欧美| 日韩极品在线观看| 国产精品69毛片高清亚洲| 91在线看国产| 欧美精选一区二区| 久久久久久久久久久电影| 亚洲色图欧洲色图| 免费观看在线综合色| eeuss鲁片一区二区三区在线观看 eeuss鲁片一区二区三区在线看 | 欧美色图12p| 精品国产髙清在线看国产毛片| 26uuu国产一区二区三区| 国产精品伦一区| 日韩成人免费在线| 成人h动漫精品一区二区| 欧美午夜精品一区二区三区| 欧美精品一区二区高清在线观看| 国产欧美日韩不卡免费| 亚洲人成精品久久久久| 麻豆精品国产91久久久久久| 99在线精品视频| 欧美va亚洲va国产综合| 亚洲激情图片一区| 国产一区二区伦理片| 欧美日韩一区视频| 国产精品蜜臀在线观看|