⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 process.h

📁 瑞星微公司RK27XX系列芯片的SDK开发包
💻 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 + -