OSDN Git Service

add Cortex-M3 PendSV
[hos/hos-v4a.git] / cfgrtr / source / intstk.cpp
1 // ---------------------------------------------------------------------------
2 //  Hyper Operating System V4  コンフィギュレーター
3 //    HOS_INT_STK API の処理
4 //
5 //                                    Copyright (C) 1998-2010 by Project HOS
6 //                                    http://sourceforge.jp/projects/hos/
7 // ---------------------------------------------------------------------------
8
9
10 #include <stdio.h>
11 #include <stdlib.h>
12 #include <string.h>
13 #include "defercd.h"
14 #include "intstk.h"
15 #include "analyze.h"
16 #include "readcfg.h"
17
18
19 #define INTSTK_STKSZ            0
20 #define INTSTK_STK                      1
21
22
23 #define DEFAULT_SIZE            "256"
24 #define DEFAULT_STACK           "NULL"
25
26
27 // コンストラクタ
28 CApiIntStack::CApiIntStack()
29 {
30         // パラメーター構文設定
31         m_iParamSyntax[0] = 0;          // 単独パラメーター
32         m_iParams = 2;
33
34         // スタックポインタ
35         m_szStackPointer[0] = '\0';
36 }
37
38
39 // デストラクタ
40 CApiIntStack::~CApiIntStack()
41 {
42 }
43
44
45 // 自動ID番号割り当て
46 int CApiIntStack::AutoId(void)
47 {
48         return CFG_ERR_OK;
49 }
50
51
52 // APIの解析
53 int CApiIntStack::AnalyzeApi(const char* pszApiName, const char* pszParams)
54 {
55         if ( strcmp(pszApiName, "KERNEL_INT_STK") == 0 )
56         {
57                 if ( m_iObjs > 0 )
58                 {
59                         return CFG_ERR_MULTIDEF;
60                 }
61
62                 if ( m_szStackPointer[0] != '\0' )
63                 {
64                         return CFG_ERR_DEF_CONFLICT;
65                 }
66
67                 return AddParams(pszParams);
68         }
69
70         return CFG_ERR_NOPROC;
71 }
72
73
74 // cfgファイル定義部書き出し
75 void  CApiIntStack::WriteCfgDef(FILE* fp)
76 {
77         const char* pszSize;
78         const char* pszStack;
79
80         // パラメータ読み出し
81         if ( m_iObjs <= 0 )
82         {
83                 pszSize  = DEFAULT_SIZE;
84                 pszStack = DEFAULT_STACK;
85         }
86         else
87         {
88                 pszSize  = m_pParamPacks[0]->GetParam(INTSTK_STKSZ);
89                 pszStack = m_pParamPacks[0]->GetParam(INTSTK_STK);
90         }
91
92
93         // コメント出力
94         fputs(
95                 "\n\n\n"
96                 "/* ------------------------------------------ */\n"
97                 "/*             interrupt stack                */\n"
98                 "/* ------------------------------------------ */\n\n"
99                 , fp);
100
101         if ( strcmp(pszStack, "NULL") == 0 )
102         {
103                 fprintf(
104                                 fp,
105                                 "VP       _kernel_int_stkblk[((%s) + sizeof(VP) - 1) / sizeof(VP)];\n"
106                                 "const VP _kernel_int_isp = &_kernel_int_stkblk[((%s) + sizeof(VP) - 1) / sizeof(VP)];\n",
107                                 pszSize, pszSize);
108         }
109         else
110         {
111                 fprintf(
112                                 fp,
113                                 "const VP _kernel_int_isp = (VP)((VB *)(%s) + (SIZE)(%s));\n",
114                                 pszStack, pszSize);
115         }
116 }
117
118
119 // cfgファイル起動部書き出し
120 void CApiIntStack::WriteCfgIni(FILE* fp)
121 {
122         const char* pszSize;
123         const char* pszStack;
124
125         // パラメータ読み出し
126         if ( m_iObjs <= 0 )
127         {
128                 pszSize  = DEFAULT_SIZE;
129                 pszStack = DEFAULT_STACK;
130         }
131         else
132         {
133                 pszSize  = m_pParamPacks[0]->GetParam(INTSTK_STKSZ);
134                 pszStack = m_pParamPacks[0]->GetParam(INTSTK_STK);
135         }
136
137
138         if ( strcmp(pszStack, "NULL") == 0 )
139         {
140                 fprintf(
141                         fp,
142                         "\t_KERNEL_SYS_INI_INTSTK((SIZE)sizeof(_kernel_int_stkblk), (VP)(_kernel_int_stkblk));\n");
143         }
144         else
145         {
146                 fprintf(
147                         fp,
148                         "\t_KERNEL_SYS_INI_INTSTK((SIZE)(%s), (VP)(%s));\n",
149                         pszSize, pszStack);
150         }
151 }
152
153 void CApiIntStack::WriteStackMemory(FILE* fp)
154 {
155         const char* pszSize;
156         const char* pszStack;
157
158         // パラメータ読み出し
159         if ( m_iObjs <= 0 )
160         {
161                 pszSize  = DEFAULT_SIZE;
162                 pszStack = DEFAULT_STACK;
163         }
164         else
165         {
166                 pszSize  = m_pParamPacks[0]->GetParam(INTSTK_STKSZ);
167                 pszStack = m_pParamPacks[0]->GetParam(INTSTK_STK);
168         }
169
170         if ( strcmp(pszStack, "NULL") == 0 )
171         {
172                 fprintf(fp, "extern VP       _kernel_int_stkblk[((%s) + sizeof(VP) - 1) / sizeof(VP)];\n", pszSize);
173         }
174 }
175
176
177 void CApiIntStack::WriteStackPointer(FILE* fp)
178 {
179         const char* pszSize;
180         const char* pszStack;
181
182         // パラメータ読み出し
183         if ( m_iObjs <= 0 )
184         {
185                 pszSize  = DEFAULT_SIZE;
186                 pszStack = DEFAULT_STACK;
187         }
188         else
189         {
190                 pszSize  = m_pParamPacks[0]->GetParam(INTSTK_STKSZ);
191                 pszStack = m_pParamPacks[0]->GetParam(INTSTK_STK);
192         }
193
194         if ( strcmp(pszStack, "NULL") == 0 )
195         {
196                 fprintf(fp, "&_kernel_int_stkblk[((%s) + sizeof(VP) - 1) / sizeof(VP)]", pszSize);
197         }
198         else
199         {
200                 fprintf(fp, "(VB *)(%s) + (SIZE)(%s)", pszStack, pszSize);
201         }
202 }
203
204
205
206 // ---------------------------------------------------------------------------
207 //  end of file
208 // ---------------------------------------------------------------------------