?? arm_00_os_core.h
字號:
/**********************************************************************************************
本程序只供學習使用,不得用于其它任何用途,否則后果自負。
ARM_00_OS_Core.H file
作者:Computer-lov
建立日期:2006-5-1
修改日期:2006-5-15
最后修改時間:2006-08-25
版本:V1.0
版權所有,盜版必究。
任何技術問題可到我的博客上留言: http://computer00.21ic.org
Copyright(C) Computer-lov 2006-2016
All rights reserved
**********************************************************************************************/
#ifndef __ARM_00_OS_CORE_H__
#define __ARM_00_OS_CORE_H__
//消息結構體
//用來保存一則消息
typedef struct OSMsg
{
volatile uint32 MsgType; //消息的類型
volatile uint32 Length; //本則消息的長度
struct OSpcb * Sender; //消息的發送者
volatile uint32 * volatile pMsg; //指向消息內容的指針
}OSMsg;
//OSpcb結構體——進程控制塊
typedef struct OSpcb
{
struct OSpcb * Prior; //指向前一個pcb
struct OSpcb * Next; //指向后一個pcb
volatile uint32 PID; //程序ID號。用的是申請到的內存塊的首地址
volatile uint32 Delay; //延遲時鐘節拍數
volatile uint32 Priority; //任務的優先級。該值越小,優先級越高。操作系統保留0號及0xFFFFFFFF號優先級
volatile uint32 TaskSP; //任務切換時,保存堆棧指針使用。
volatile uint32 StackLength; //任務創建時,申請的堆棧長度。單位為字節。
volatile uint32 Status; //任務所處的狀態。有OSInRunning、StatusOSInDelayStatus、OSInSuspendingStatus
volatile uint64 TotalRunTime; //該任務總運行時間。時間單位由定時器0計數1的值決定。
volatile uint32 RunTimeInThisRefreshPeriod; //該任務在一個刷新周期內,運行的時間,運行的時間。時間單位由定時器0計數1的值決定。
volatile uint32 WaitFor; //任務等待的資源
struct OSMsg * Msg; //消息指針
volatile uint8 Title[16]; //任務的標題
}OSpcb;
//OSSortPcb結構體。該結構體用來做一些pcb列表的底部,由于底部一些變量是無用的,因此建一個短表,可以節省RAM
//所有成員的意義同OSpcb結構體。
typedef struct OSShortPcb
{
struct OSpcb * Prior;
struct OSpcb * Next;
volatile uint32 PID;
volatile uint32 Delay;
volatile uint32 Priority;
}OSShortPcb;
extern OSpcb * OSReadyList; //就緒態任務表表頭
extern OSpcb * OSSuspendList; //掛起態任務表表頭
extern OSpcb * OSDelayList; //延時態任務表表頭
extern OSpcb * OSCurrentPcb; //當前運行的任務
extern OSpcb OSSystemIdlePcb; //系統空閑任務
#define OSReadyListBottom OSSystemIdlePcb //就緒態列表的底部為系統空閑表
extern OSShortPcb OSSuspendListBottom; //掛起態列表表底
extern OSShortPcb OSDelayListBottom; //延時態列表表底
//設備
typedef struct OSdevice
{
struct OSdevice * Next; //指向下一個設備
volatile OSpcb * User; //使用該設備的當前任務
volatile uint32 RequestCount; //請求使用該設備的任務數
volatile uint32 DeviceID; //該設備的ID號
}OSdevice;
extern OSdevice * OSDeviceList; //設備列表
void OSInit(void); //操作系統初始化
void OSTickInit(void); //時鐘節拍初始化
#define OS_I_Bit 0x00000080 /*IRQ中斷控制位*/
#define OS_F_Bit 0x00000040 /*FIQ中斷控制位*/
#define OS_ARM_MODE 0x00000000 /*選擇任務為ARM代碼*/
#define OS_THUMB_MODE 0x00000020 /*選擇任務為THUMB代碼*/
#define MaxOfTimer0 (216000/100-1) /*定時器0計數的最大值。定時器0由最0開始增加,增加到最大值時(跟T0MR0匹配),發生中斷,產生時鐘節拍。時鐘節拍被設置為100Hz*/
#define RefreshPeriod 200 /*任務管理器的刷新周期。設置為200,表示200個時間片刷新一次,即2S刷新一次*/
#define TotalTime ((MaxOfTimer0+1)*RefreshPeriod) /*任務管理器運行一次的總時間數*/
#define OSInReadyStatus 0x00000001 /*就緒狀態*/
#define OSInDelayStatus 0x00000002 /*延時狀態*/
#define OSInSuspendStatus 0x00000004 /*掛起狀態*/
extern volatile uint32 CopyOfVICIntEnable; //用來備份CopyOfVICIntEnable的狀態
//extern volatile uint32 CopyOfIRQEN; //用來備份IRQEN的狀態
//extern volatile uint32 CopyOfFIQEN; //用來備份FIQEN的狀態
extern volatile uint32 OSEnCrCount; //用來統計進入臨界代碼段次數
extern volatile uint32 TimeOfTaskStart; //用來保存一個任務剛被切換到運行態的時刻
void OSTaskDelay(uint32 NumOfTick); //延任務時NumOfTick個時鐘節拍
uint32 OSTaskSuspend(OSpcb * pcb); //將一個任務掛起
#define NO_SUCH_A_TASK 1 /*錯誤代號:該任務不存在*/
#define CAN_NOT_BE_SUSPENDED 2 /*錯誤代號:該任務不能被掛起*/
void OSSystemIdle(void); //系統空閑任務
void OSTaskManager(void); //任務管理器
void OSEnterCritical(void); /*進入臨界段*/
void OSExitCritical(void); /*退出臨界段*/
#if CPU_TYPE==2131
#define OSSizeOfMemoryPool (7*1024) //緩沖池為7K字節
#endif
#if CPU_TYPE==2132
#define OSSizeOfMemoryPool (15*1024) //緩沖池為15K字節
#endif
#if CPU_TYPE==2134
#define OSSizeOfMemoryPool (15*1024) //緩沖池為15K字節
#endif
#if CPU_TYPE==2136
#define OSSizeOfMemoryPool (31*1024) //緩沖池為31K字節
#endif
#if CPU_TYPE==2138
#define OSSizeOfMemoryPool (31*1024) //緩沖池為31K字節
#endif
#define OSSizePerBlock (4*4) //每塊大小為16字節
#define MEMORY_INIT 0
#define MEMORY_ALLOCATION 1 /*操作代碼0,分配內存*/
#define MEMORY_FREE 2 /*操作代碼1,釋放內存*/
#define MEMORY_STATISTIC 4 /*操作代碼2,統計內存*/
#define GET_MEMORY_POOL_SIZE 8 /*操作代碼4,獲取內存緩沖池大小*/
#define MEMORY_TEST 16 /*操作代碼8,內存檢測*/
uint32 OSMemoryManage(uint32 Operation,uint32 StartAddr,uint32 Length); /*內存管理函數*/
#define OSMalloc(Length) OSMemoryManage(MEMORY_ALLOCATION,0,(Length)) /*申請一塊長度為Length字節的內存塊*/
#define OSFree(StartAddr,Length) OSMemoryManage(MEMORY_FREE,StartAddr,Length) /*釋放地址為StartAddr,長度為Length的一塊內存*/
#define OSMemoryStatistic() OSMemoryManage(MEMORY_STATISTIC,0,0) /*統計內存使用量*/
#define OSGetMemoryPoolSize() OSMemoryManage(GET_MEMORY_POOL_SIZE,0,0) /*獲取內存緩沖池的大小*/
#define OSMemoryTest() OSMemoryManage(MEMORY_TEST,0,0) /*內存檢測*/
#define OSMemoryInit() OSMemoryManage(MEMORY_INIT,0,0) /*內存初始化*/
extern volatile uint32 TaskAmount; //用來統計共有多少個任務
uint64 OSTaskCreat(uint32 TaskEntryAddr,uint32 StackLength,uint32 Priority,uint32 Mode,uint8 *TaskName); /*創建一個任務*/
//定義各種消息類型
#define SYSTEM_MSG 1 /*系統消息*/
#define KEYBOARD_MSG 2 /*鍵盤消息*/
#define UART_MSG 3 /*串口消息*/
uint32 OSSendMsg(OSpcb * pcb,OSMsg * pMsg); //發送消息函數
uint32 OSTaskKill(OSpcb * pcb); //殺死一個任務
#define OSTaskSelfKill() OSTaskKill(OSCurrentPcb) /*任務自殺*/
#define OS_PRINTER_DEVICE_ID 1 /*打印機設備的ID號*/
#define NO_SUCH_A_DEVICE 1 /*設備錯誤代號*/
uint32 OSAddDevice(uint32 DeviceID); //添加一個設備
uint32 OSDeleteDevice(uint32 DeviceID); //刪除指定的任務
uint32 OSGetDeviceAddr(uint32 DeviceID); //根據設備ID號,獲取設備結構體的指針地址
uint32 OSRequestDevice(uint32 DeviceAddr,uint32 DelayTicks); //申請設備
void OSFreeDevice(uint32 DeviceAddr); //設備使用完畢,釋放設備
#endif
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -