OSDN Git Service

add Cortex-M3 PendSV
[hos/hos-v4a.git] / cfgrtr / source / intstk.cpp
index f1cfbdb..7332136 100755 (executable)
@@ -1,9 +1,9 @@
 // ---------------------------------------------------------------------------
-//  Hyper Operating System V4  コンフィギュレーター                           
-//    HOS_INT_STK API の処理                                                  
-//                                                                            
-//                                    Copyright (C) 1998-2003 by Project HOS  
-//                                    http://sourceforge.jp/projects/hos/     
+//  Hyper Operating System V4  コンフィギュレーター
+//    HOS_INT_STK API の処理
+//
+//                                    Copyright (C) 1998-2010 by Project HOS
+//                                    http://sourceforge.jp/projects/hos/
 // ---------------------------------------------------------------------------
 
 
 #define INTSTK_STK                     1
 
 
+#define DEFAULT_SIZE           "256"
+#define DEFAULT_STACK          "NULL"
+
+
 // コンストラクタ
 CApiIntStack::CApiIntStack()
 {
@@ -62,21 +66,6 @@ int CApiIntStack::AnalyzeApi(const char* pszApiName, const char* pszParams)
 
                return AddParams(pszParams);
        }
-       else if ( strcmp(pszApiName, "KERNEL_INT_ISP") == 0 )
-       {
-               if ( m_iObjs > 0 )
-               {
-                       return CFG_ERR_DEF_CONFLICT;
-               }
-
-               if ( m_szStackPointer[0] != '\0' )
-               {
-                       return CFG_ERR_MULTIDEF;
-               }
-
-               strcpy(m_szStackPointer, pszParams);
-               return CFG_ERR_OK;
-       }
 
        return CFG_ERR_NOPROC;
 }
@@ -87,14 +76,20 @@ void  CApiIntStack::WriteCfgDef(FILE* fp)
 {
        const char* pszSize;
        const char* pszStack;
-       int i;
 
        // パラメータ読み出し
-       if ( m_iObjs <= 0 && m_szStackPointer[0] == '\0' )
+       if ( m_iObjs <= 0 )
+       {
+               pszSize  = DEFAULT_SIZE;
+               pszStack = DEFAULT_STACK;
+       }
+       else
        {
-               return ;
+               pszSize  = m_pParamPacks[0]->GetParam(INTSTK_STKSZ);
+               pszStack = m_pParamPacks[0]->GetParam(INTSTK_STK);
        }
 
+
        // コメント出力
        fputs(
                "\n\n\n"
@@ -103,56 +98,111 @@ void  CApiIntStack::WriteCfgDef(FILE* fp)
                "/* ------------------------------------------ */\n\n"
                , fp);
 
-       // 割り込み用スタックポインタ出力
-       if ( m_szStackPointer[0] != '\0' )
+       if ( strcmp(pszStack, "NULL") == 0 )
        {
                fprintf(
-                       fp,
-                       "const VP _kernel_int_isp[1] = {(VP)(%s)};\t/* interrupt initial stack pointer */\n",
-                       m_szStackPointer);
+                               fp,
+                               "VP       _kernel_int_stkblk[((%s) + sizeof(VP) - 1) / sizeof(VP)];\n"
+                               "const VP _kernel_int_isp = &_kernel_int_stkblk[((%s) + sizeof(VP) - 1) / sizeof(VP)];\n",
+                               pszSize, pszSize);
        }
        else
        {
-               pszSize  = m_pParamPacks[0]->GetParam(INTSTK_STKSZ);
-               pszStack = m_pParamPacks[0]->GetParam(INTSTK_STK);
-               
-               if ( strcmp(pszStack, "NULL") == 0 )
-               {
-                       fprintf(
-                               fp,
-                               "VP         _kernel_int_stkblk[((%s) + sizeof(VP) - 1) / sizeof(VP)];\t/* interrupt stack block*/\n",
-                               pszSize, _KERNE_INTSTK_NUM);
-                               pszStack = "_kernel_int_stkblk";
-               }
-               else
-               {
-                       fprintf(
+               fprintf(
                                fp,
-                               "const VP _kernel_int_isp[1] = {(VP)((VB *)(%s) + (%s))};\t/* interrupt initial stack pointer */\n",
+                               "const VP _kernel_int_isp = (VP)((VB *)(%s) + (SIZE)(%s));\n",
                                pszStack, pszSize);
-               }
+       }
+}
 
-               fprintf(
-                       fp,
-                       "\n/* interrupt initial stack pointer */\n"
-                       "const VP   _kernel_int_isp[%d] =\n{\n",
-                       _KERNE_INTSTK_NUM);
 
-               for ( i = 0; i < _KERNE_INTSTK_NUM; i++ )
-               {
-                       fprintf(
-                               fp,
-                                       "\t(VP)((VB *)(%s) + ((((%s) / %d) & ~(sizeof(VP) - 1)) * %d)),\n",
-                                       pszStack, pszSize, _KERNE_INTSTK_NUM, i+1);
-               }
+// cfgファイル起動部書き出し
+void CApiIntStack::WriteCfgIni(FILE* fp)
+{
+       const char* pszSize;
+       const char* pszStack;
 
+       // パラメータ読み出し
+       if ( m_iObjs <= 0 )
+       {
+               pszSize  = DEFAULT_SIZE;
+               pszStack = DEFAULT_STACK;
+       }
+       else
+       {
+               pszSize  = m_pParamPacks[0]->GetParam(INTSTK_STKSZ);
+               pszStack = m_pParamPacks[0]->GetParam(INTSTK_STK);
+       }
+
+
+       if ( strcmp(pszStack, "NULL") == 0 )
+       {
+               fprintf(
+                       fp,
+                       "\t_KERNEL_SYS_INI_INTSTK((SIZE)sizeof(_kernel_int_stkblk), (VP)(_kernel_int_stkblk));\n");
+       }
+       else
+       {
                fprintf(
                        fp,
-                       "};\n\n");
+                       "\t_KERNEL_SYS_INI_INTSTK((SIZE)(%s), (VP)(%s));\n",
+                       pszSize, pszStack);
        }
 }
 
+void CApiIntStack::WriteStackMemory(FILE* fp)
+{
+       const char* pszSize;
+       const char* pszStack;
+
+       // パラメータ読み出し
+       if ( m_iObjs <= 0 )
+       {
+               pszSize  = DEFAULT_SIZE;
+               pszStack = DEFAULT_STACK;
+       }
+       else
+       {
+               pszSize  = m_pParamPacks[0]->GetParam(INTSTK_STKSZ);
+               pszStack = m_pParamPacks[0]->GetParam(INTSTK_STK);
+       }
+
+       if ( strcmp(pszStack, "NULL") == 0 )
+       {
+               fprintf(fp, "extern VP       _kernel_int_stkblk[((%s) + sizeof(VP) - 1) / sizeof(VP)];\n", pszSize);
+       }
+}
+
+
+void CApiIntStack::WriteStackPointer(FILE* fp)
+{
+       const char* pszSize;
+       const char* pszStack;
+
+       // パラメータ読み出し
+       if ( m_iObjs <= 0 )
+       {
+               pszSize  = DEFAULT_SIZE;
+               pszStack = DEFAULT_STACK;
+       }
+       else
+       {
+               pszSize  = m_pParamPacks[0]->GetParam(INTSTK_STKSZ);
+               pszStack = m_pParamPacks[0]->GetParam(INTSTK_STK);
+       }
+
+       if ( strcmp(pszStack, "NULL") == 0 )
+       {
+               fprintf(fp, "&_kernel_int_stkblk[((%s) + sizeof(VP) - 1) / sizeof(VP)]", pszSize);
+       }
+       else
+       {
+               fprintf(fp, "(VB *)(%s) + (SIZE)(%s)", pszStack, pszSize);
+       }
+}
+
+
 
 // ---------------------------------------------------------------------------
-//  Copyright (C) 1998-2006 by Project HOS                                    
+//  end of file
 // ---------------------------------------------------------------------------