📄 process.h
字号:
/******************************************************************/
/* Copyright (C) 2007 ROCK-CHIPS FUZHOU . All Rights Reserved. */
/*******************************************************************
File : process.h
Desc : 定义DLL 或者 EXE 概念下的进程控制操作和数据。
Author : huangsl
Date : 2007-06-25
Notes :
$Log: process.h,v $
Revision 1.10 2007/12/24 07:56:12 Lingzhaojun
同步蓝魔版本基本模块
Revision 1.9 2007/12/06 05:16:21 Huangshilin
增加 视频静态buffer和GUI 复用.修改窗口系统.
Revision 1.8 2007/11/27 14:01:35 Huangshilin
修改 音频刷屏噪音,系统反应慢的 BUG.
Revision 1.7 2007/11/23 07:32:08 Huangshilin
no message
Revision 1.6 2007/11/07 09:10:39 Huangshilin
增加部分接口和 TOP 应用支持.
Revision 1.5 2007/11/05 09:53:49 Huangshilin
增加GUI接口,增加应用资源互斥控制.
Revision 1.4 2007/10/13 02:34:17 Huangshilin
System
Revision 1.3 2007/10/11 04:08:10 Huangshilin
System\os
Revision 1.2 2007/10/08 02:56:40 Lingzhaojun
添加版本自动注释脚本
* huangsl 2007-06-25 create file.
*
* huangsl 2007-08-25 由于在 ROPI,RWPI 编译的情况下,某些函数会改变
* sb 指针,因此增加保存 SB 的宏定义.
* 使用如下: DECLARE_SB , PROC_SAVESB() .... PROC_LOADSB()
*********************************************************************/
#ifndef _OS_PROCESS_H
#define _OS_PROCESS_H
/********************************************************************/
#include "rocktask.h"
/********************************************************************/
#define PROC_DEBUG 0
/********************************************************************
GLOBAL MACROS DEFINE
********************************************************************/
//#define PROC_PCBMAX 30
#define PROC_CACHERESMAX 4
/********************************************************************/
/*********************************************************************/
#define DECLARE_SB char* save_sb
//AREA_SDRAM_CODE_END - 1024*200(0x32000)
#define PROC_ROPI_BASE (0x175CE000u) //不能改变,模块编译的地址必须设为这个值.
#ifdef __arm
__global_reg(6) char *sb; //需要打开,否则 BEGIN_CALL 无用.
#ifdef DLL
#define PROC_GETSB( pHandle ) (((INT32U*)pHandle)[1])
#define PROC_GETSC( pHandle ) (((INT32U*)pHandle)[2])
#define BEGIN_CALL( sb ) ASM { MOV save_sb , R9 ;\
mov r9 , sb }
#define BEGIN_CALL_PROC( pHandle ) BEGIN_CALL(PROC_GETSB(pHandle))
#define END_CALL() ASM { MOV R9 , save_sb }
#define PROC_SAVESB() ASM { MOV save_sb , R9 }
#define PROC_LOADSB() ASM { MOV R9 , save_sb }
#else
#define BEGIN_CALL( sb )
#define BEGIN_CALL_PROC( pHandle )
#define END_CALL()
#define PROC_GETSB( pHandle ) PROC_ROPI_BASE
#define PROC_GETSC( pHandle ) PROC_ROPI_BASE
#define PROC_SAVESB()
#define PROC_LOADSB()
#endif
#else //NOT ARM
#define BEGIN_CALL( sb )
#define BEGIN_CALL_PROC( pHandle )
#define END_CALL()
#define PROC_GETSB( pHandle ) PROC_ROPI_BASE
#define PROC_GETSC( pHandle ) PROC_ROPI_BASE
#define PROC_SAVESB()
#define PROC_LOADSB()
#endif
#define PROC_GETGLOBAL(type , globalAddr , pHandle) {globalAddr =(type) ((char*)globalAddr + PROC_GETSC(pHandle)-PROC_ROPI_BASE );}
#define PROC_GETFUNCTION(type , func , pHandle ) {if(PROC_GETSB(pHandle) ) \
func = ( (type)(PROC_GETSC( pHandle ) + ((INT32U)(func) - PROC_ROPI_BASE) ));}
/*********************************************************************/
/*********************************************************************
ENUMERATIONS AND STRUCTURES
*********************************************************************/
#define INVALID_PHANDLE ((PROCHANDLE)NULL) // NOT CHANGE!!
/***************************************************************************/
//接口结构
typedef struct _PROCESS_IFACE
{
INT32U iSIze; //sizeof iface
INT32U sb; //read only ,内部赋值
BOOLEAN iValid; //read only ,内部赋值
} PROCESS_IFACE, *PPROCESS_IFACE;
//return 0: OK , 其他: 错误.
//第一个差数为当前 DLL 的进程.
//for ProcDllInitilize 的第二个参数.
#define PROC_INIT 0 //初始化
#define PROC_DEINIT 1 //反初始化.
typedef INT32U(*ProcDllInitilize)(PROCHANDLE , INT32U , PPROCESS_IFACE);
//p1:PARENT WINDOW , p2: opened file path , p3: reserved
typedef INT32U(*ModelEntry)(void* , char* , void*); //FILE PATH
/***************************************************************************/
// VALUE FOR GUID_NODEINFO:Property
#define GUID_PROP_DLL (1u<<0) //默认为 EXE.
#define GUID_PROP_TOOLBAR (1u<<1) // 工具栏,总是 最前面显示.
#define GUID_PROP_TASKBAR (1u<<2) // 任务栏,总是 最前面显示.
#define GUID_PROP_NOKEY (1u<<3) //该应用不接收按键消息.
#define GUID_PROP_NOTOUCH (1u<<4) //该应用 不接受收 触摸屏消息.
#define PROC_PROP_IDATA (0x1u<<8) //DLL 不同的 INSTANCE 是分开的,只能为 PROC_PROP_RELOC 属性具有.
#define PROC_PROP_MINST (0x1u<<9) //EXE 可以具有多个实例,即同时打开多个.
#define GUID_PROP_TOPSHOW (GUID_PROP_TOOLBAR|GUID_PROP_TASKBAR)
//FOR PCB
#define PROC_PROP_LOADING (0x1u<<28) //正在建立应用的过程中.
#define PROC_PROP_DLTING (0x1u<<29) //正在删除状态
#define PROC_PROP_NCPL (0x1u<<30) //正在加载过程中
#define PROC_PROP_ALLOC (0x1u<<31) //已经加载
// VALUE FOR GUID_NODEINFO:HwResource,用于控制模块互斥情况.
// 音频分为两种情况,因为 FM录音的情况下 radioplay 可以不要关闭.
#define GUID_HWRES_MP3 (1u<<0)
#define GUID_HWRES_FM (1u<<1)
#define GUID_HWRES_AUDIO (GUID_HWRES_MP3|GUID_HWRES_FM) //音频资源 .
#define GUID_HWRES_ALL (0XFFFFFFFF) //独占所有的资源.
//每一个GUID 对应一个节点.
#define APPNAME_LEN 11 //19 , 080417,huangsl,改为与注册表节点名称一样,以避免数据改写问题.
//071103,huangsl,在 DLL 的形式下,模块一切与模块相关的属性通过 注册表来记录,
// 与代码脱离.
typedef struct _GUID_NODEINFO
{
INT32U Size; //结构的大小.
RK_GUID Guid;
//应用属性,如 多实例等.
INT32U Property;
#if defined( DLL ) || defined(_REGISTER)
//如果是动态加载,许亚记录模块的版本号,以便升级比较。
char FilePath[12]; //文件名
INT16U GuidVersion; //模块版本号,用于模块安装.
INT16U CallSid; // 显示的 SID,安装的时候或加载的时候 设置.
#else
ProcDllInitilize ProcMain;
ModelEntry Entry;
#endif
INT32U HwResource; // 用于描述 该模块使用到的硬件资源,每位 表示一种,
// 表示一种抽象的 互斥关系,更具体的控制可以通过 资源接口来实现.
} GUID_NODEINFO , *PGUID_NODEINFO;
typedef struct _GUID_NODE
{
char RegKey[APPNAME_LEN+1]; //子键的名称,即模块的显示名称-ASCII
GUID_NODEINFO GuidNode;
} GUID_NODE , *PGUID_NODE;
typedef struct _GUID_NODE_REG
{
INT32U Size;
#if defined( DLL ) || defined(_REGISTER )
char Path[24]; // 模块所在的目录.
#endif
PGUID_NODE pGuidNodes;
} GUID_NODE_REG , *PGUID_NODE_REG;
//扩展名注册登记信息.
typedef struct _GUID_FILEEXT
{
char RegisterFileExt[4];
//通过名称而不是 GUID 来标记,因为在 DLL 的情况下,GUID 不是必要的.
char RegKey[APPNAME_LEN+1];//子键的名称,即模块的显示名称.
} GUID_FILEEXT , *PGUID_FILEEXT;
typedef struct
{
INT32U Size;
PGUID_FILEEXT pGuidFileExt; //文件注册列表.
} APP_FILEEXT , *PAPP_FILEEXT;
//msg for MS_GUGU_SwitchAppInd
typedef struct
{
PROCHANDLE Proc;
char* FilePath;
void* Param;
} MSG_SWITCHAPP, *PMSG_SWITCHAPP;
/*********************************************************************
FUNCTION PROTOTYPES
*********************************************************************/
//DLL 入口函数定义. 0 表示正确,其他表示错误.
//在初始化代码里面最好不要访问 应用资源,因为此时资源还没有 BUFFER。
INT32U ProcMain(PROCHANDLE Parent , INT32U ReasonForCall , PPROCESS_IFACE procIface);
//PROCESS.C
// 系统堆栈 申请接口 .
#if 0
char* IProcBlockMalloc(size_t size);
void IProcBlockFree(char *__ptr);
#else
#define IProcBlockMalloc( s ) (char*)MALLOC(s)
#define IProcBlockFree( p ) FREE( p )
#endif
void ProcInitialize(void); //初始化
PROCHANDLE ProcGetProc(INT32U rpc);
//ProcIface 为该模块提供的接口参数,即都通过接口形式提供参数外部调用。
#if 1 //defined(DLL )
#define ProcLoadProc( ProcPathName , ProcIface ) \
ProcLoadProcFileEx( ProcPathName , ProcIface , GUID_RESERVED , ProcGetCurrentProc() )
#endif
PROCHANDLE ProcLoadProcFileEx(char* ProcPathName , PPROCESS_IFACE ProcIface,
RK_GUID guID , PROCHANDLE currProc);
#ifdef DLL
#define ProcLoadProcGuid( guid , ProcIface ) ProcLoadProcGuidEx( guid , ProcIface , ProcGetCurrentProc() )
#endif
PROCHANDLE ProcLoadProcGuidEx(RK_GUID Guid , PPROCESS_IFACE ProcIface , PROCHANDLE currProc);
BOOLEAN ProcUnLoadProc(PROCHANDLE ProcHandle); //加载模块
BOOLEAN ProcDoUnloadReq(PROCHANDLE pProcHandle);
INT32U ProcGetFunAddr(PROCHANDLE ProcHandle , char* FunName); //获取模块函数
INT32U ProcGetEntryPoint(PROCHANDLE ProcHandle);
//取得当前代码所在的 PROCESS. 返回值可以作为 其他接口的 PROCHANDLE 参数.
#if 1 //defined(DLL )
PROCHANDLE ProcGetCurrentProc(void);
#endif
PROCHANDLE ProcGetProcGuid(RK_GUID guid);
//改为 RockCreateThread
//BOOLEAN ProcSetMsgHandle(PROCHANDLE ProcHandle , TaskMsgHandle taskHandle , INT32U tPriority ); //设置一个进程中的"线程"
void ProcSetTopProc(PROCHANDLE ProcHandle); //设置当前的 PROC 为 TOP PROC,如 SET FOCUS。
PROCHANDLE ProcGetTopProc(void);
//PROCHANDLE ProcGetCurrLoadProc(void);
PROCHANDLE ProcCheckExistGuid(RK_GUID Guid);
BOOLEAN ProcEnquireHwResourceProc(PROCHANDLE currProc ,
PGUID_NODEINFO newProcNode);
INT32U ProcGetProperty(PROCHANDLE proc);
INT32U ProcGetGuid(PROCHANDLE proc);
#if 0 //该接口 已经屏蔽,由 window.c 的接口 WindowAppStartEx 代替.
PROCHANDLE ProcStartAppGuidEx(RK_GUID Guid ,
char* OpenedFilePath , PROCHANDLE currProc , PPROCESS_IFACE ProcIface , void* Param);
PROCHANDLE ProcStartAppFileEx(char* filePath ,
PROCHANDLE currProc , PPROCESS_IFACE ProcIface , void* Param);
#endif
#ifdef PROC_CHECKVALID
BOOLEAN ProcCheckHandleValid(PROCHANDLE ProcHandle); //查看 PROC是否有效.
#endif
// PROCESS RESOUREC
BOOLEAN ResApiCheckProcFile(PROCHANDLE proc);
void ResApiCacheProcResource(PROCHANDLE proc);
void ResApiFreeProcCacheResource(PROCHANDLE proc);
INT32U ResApiReadProcResource(PROCHANDLE proc ,
INT32U offSet , void *Buffer , INT32U size);
INT32U ResApiGuiDspReadProcResource(PROCHANDLE proc,
INT32U offSet , void **Buffer, INT32U size);
void* ResApiGetProcCacheData(PROCHANDLE proc , char* dataNeme , INT32U *outByteSize);
INT32U ResApiGetProcData(PROCHANDLE proc , char* dataNeme , INT32U *outByteSize);
INT32U ResApiGetIdDataOffset(PROCHANDLE proc , INT16U ID , INT16U IdType , INT32U *outDataSize);
INT32U ResApiGetStringIDString(PROCHANDLE proc , INT16U strID ,
WCHAR * outIDString , INT32U outBufferSize);
void ResApiFreeCachePtr(void *pCache);
//thread
THANDLE RockCreateThread(PROCHANDLE proc , TaskMsgHandle h , INT32U Prio);
void RockKillThread(PROCHANDLE proc , THANDLE ThreadHandle);
void RockKillThreadPrio(PROCHANDLE proc , INT32U TaskPrio);
/*********************************************************************************/
#if PROC_DEBUG > 0
void TestProcess(void);
#endif
/**************************************************************/
#endif //_OS_PROCESS_H
/*********************************************************************
END OF FILE
*********************************************************************/
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -