1 /*
2 * Copyright (c) 2009-2022 Huawei Technologies Co., Ltd. All rights reserved.
3 *
4 * UniProton is licensed under Mulan PSL v2.
5 * You can use this software according to the terms and conditions of the Mulan PSL v2.
6 * You may obtain a copy of Mulan PSL v2 at:
7 * http://license.coscl.org.cn/MulanPSL2
8 * THIS SOFTWARE IS PROVIDED ON AN "AS IS" BASIS, WITHOUT WARRANTIES OF ANY KIND,
9 * EITHER EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO NON-INFRINGEMENT,
10 * MERCHANTABILITY OR FIT FOR A PARTICULAR PURPOSE.
11 * See the Mulan PSL v2 for more details.
12 * Create: 2009-12-22
13 * Description: UniProton的初始化C文件。
14 */
15 #include "prt_config_internal.h"
16
17 U8 m_aucMemRegion00[OS_MEM_FSC_PT_SIZE] ; /* 私有静态内存分区(缺省) */
18
OsConfigAddrSizeGet(uintptr_t addr,uintptr_t size,uintptr_t * destAddr,uintptr_t * destSize)19 OS_SEC_ALW_INLINE INLINE void OsConfigAddrSizeGet(uintptr_t addr, uintptr_t size,
20 uintptr_t *destAddr, uintptr_t *destSize)
21 {
22 *destAddr = addr;
23 *destSize = size;
24 }
25
OsMemConfigReg(void)26 U32 OsMemConfigReg(void)
27 {
28 U32 ret;
29
30 ret = OsFscMemInit(OS_MEM_FSC_PT_ADDR, OS_MEM_FSC_PT_SIZE);
31 if (ret != OS_OK) {
32 return ret;
33 }
34
35 return OS_OK;
36 }
37
OsMemDefPtInit(void)38 U32 OsMemDefPtInit(void)
39 {
40 return OS_OK;
41 }
42
OsMemConfigInit(void)43 U32 OsMemConfigInit(void)
44 {
45 /* 系统默认FSC内存分区初始化 */
46 return OsMemDefPtInit();
47 }
48
OsSystemReg(void)49 U32 OsSystemReg(void)
50 {
51 struct SysModInfo sysModInfo;
52
53 sysModInfo.systemClock = OS_SYS_CLOCK;
54 sysModInfo.cpuType = OS_CPU_TYPE;
55 #if defined(OS_OPTION_HWI_MAX_NUM_CONFIG)
56 sysModInfo.hwiMaxNum = OS_HWI_MAX_NUM_CONFIG;
57 #endif
58
59 return OsSysRegister(&sysModInfo);
60 }
61
62 #if (OS_INCLUDE_SEM == YES)
OsSemConfigReg(void)63 U32 OsSemConfigReg(void)
64 {
65 struct SemModInfo semModInfo;
66
67 semModInfo.maxNum = OS_SEM_MAX_SUPPORT_NUM;
68 return OsSemRegister(&semModInfo);
69
70 }
71 #endif
72
73 #if (OS_INCLUDE_TASK == YES)
OsTaskInfoSet(struct TskModInfo * taskModInfo)74 void OsTaskInfoSet(struct TskModInfo *taskModInfo)
75 {
76 taskModInfo->maxNum = OS_TSK_MAX_SUPPORT_NUM;
77 taskModInfo->defaultSize = OS_TSK_DEFAULT_STACK_SIZE;
78 taskModInfo->idleStackSize = OS_TSK_IDLE_STACK_SIZE;
79 taskModInfo->magicWord = WORD_PACK((U32)OS_TSK_STACK_MAGIC_WORD);
80 }
81 #else
82 #error "OS_INCLUDE_TASK MUST BE YES! The SWI has been cut out,the task can not cut out."
83 #endif
84
OsHookConfigReg(void)85 U32 OsHookConfigReg(void)
86 {
87 struct HookModInfo hookModInfo;
88
89 hookModInfo.maxNum[OS_HOOK_HWI_ENTRY] = OS_HOOK_HWI_ENTRY_NUM;
90 hookModInfo.maxNum[OS_HOOK_HWI_EXIT] = OS_HOOK_HWI_EXIT_NUM;
91 hookModInfo.maxNum[OS_HOOK_TSK_SWITCH] = OS_HOOK_TSK_SWITCH_NUM;
92 hookModInfo.maxNum[OS_HOOK_IDLE_PERIOD] = OS_HOOK_IDLE_NUM;
93
94 return OsHookRegister(&hookModInfo);
95 }
96
OsSysConfigReg(void)97 U32 OsSysConfigReg(void)
98 {
99 U32 ret;
100
101 ret = OsSystemReg();
102 if (ret != OS_OK) {
103 return ret;
104 }
105 return OS_OK;
106 }
107
108 #if (OS_INCLUDE_TICK == YES)
OsTickConfigReg(void)109 U32 OsTickConfigReg(void)
110 {
111 struct TickModInfo tickModInfo;
112
113 tickModInfo.tickPerSecond = OS_TICK_PER_SECOND;
114 tickModInfo.tickPriority = 0;
115
116 return OsTickRegister(&tickModInfo);
117 }
118 #endif
119
120 #if (OS_INCLUDE_TASK == YES)
OsTskConfigReg(void)121 U32 OsTskConfigReg(void)
122 {
123 struct TskModInfo taskModInfo;
124 OsTaskInfoSet(&taskModInfo);
125 return OsTskRegister(&taskModInfo);
126 }
127 #endif
128
129 #if (OS_INCLUDE_QUEUE == YES)
OsQueueConfigReg(void)130 U32 OsQueueConfigReg(void)
131 {
132 return OsQueueRegister(OS_QUEUE_MAX_SUPPORT_NUM);
133 }
134 #endif
135
136 #if (OS_INCLUDE_CPUP == YES)
OsCpupConfigReg(void)137 U32 OsCpupConfigReg(void)
138 {
139 struct CpupModInfo cpupModInfo;
140
141 cpupModInfo.cpupWarnFlag = (bool)OS_CONFIG_CPUP_WARN;
142 cpupModInfo.sampleTime = OS_CPUP_SAMPLE_INTERVAL;
143 cpupModInfo.warn = OS_CPUP_SHORT_WARN;
144 cpupModInfo.resume = OS_CPUP_SHORT_RESUME;
145
146 return OsCpupRegister(&cpupModInfo);
147 }
148 #endif
149
150 #if (OS_INCLUDE_TICK_SWTMER == YES)
OsSwTmrConfigInit(void)151 U32 OsSwTmrConfigInit(void)
152 {
153 return OsSwTmrInit(OS_TICK_SWITIMER_MAX_NUM);
154 }
155 #endif
156
157 #if (OS_INCLUDE_CPUP == YES)
158 #if (OS_INCLUDE_TICK == NO)
159 #error "OS_INCLUDE_CPUP depend on OS_INCLUDE_TICK!"
160 #endif
OsCpupConfigInit(void)161 U32 OsCpupConfigInit(void)
162 {
163 U32 ret;
164
165 ret = OsCpupInit();
166 if (ret != OS_OK) {
167 return ret;
168 }
169
170 if (OS_CONFIG_CPUP_WARN == YES) {
171 #if defined(OS_OPTION_CPUP_WARN)
172 OsCpupWarnInit();
173 #else
174 return OS_ERRNO_SYS_NO_CPUP_WARN;
175 #endif
176 }
177 return OS_OK;
178 }
179 #endif
180
181 #if (OS_INCLUDE_SEM == YES)
OsSemConfigInit(void)182 U32 OsSemConfigInit(void)
183 {
184 return OsSemInit();
185 }
186 #endif
187
188 #if (OS_INCLUDE_TASK == YES)
OsTskConfigInit(void)189 U32 OsTskConfigInit(void)
190 {
191 return OsTskInit();
192 }
193 #endif
194
195 /* 系统初始化注册表 */
196 struct OsModuleConfigInfo g_moduleConfigTab[] = {
197 /* {模块号, 模块注册函数, 模块初始化函数} */
198 {OS_MID_SYS, {OsSysConfigReg, NULL}},
199 {OS_MID_MEM, {OsMemConfigReg, OsMemConfigInit}},
200 {OS_MID_HWI, {NULL, OsHwiConfigInit}},
201 {OS_MID_HARDDRV, {NULL, PRT_HardDrvInit}},
202 {OS_MID_HOOK, {OsHookConfigReg, OsHookConfigInit}},
203 {OS_MID_EXC, {NULL, OsExcConfigInit}},
204 #if (OS_INCLUDE_TASK == YES)
205 {OS_MID_TSK, {OsTskConfigReg, OsTskConfigInit}},
206 #endif
207 #if (OS_INCLUDE_TICK == YES)
208 {OS_MID_TICK, {OsTickConfigReg, OsTickConfigInit}},
209 #endif
210
211 #if (OS_INCLUDE_TICK_SWTMER == YES)
212 {OS_MID_SWTMR, {NULL, OsSwTmrConfigInit}},
213 #endif
214
215 #if (OS_INCLUDE_CPUP == YES)
216 {OS_MID_CPUP, {OsCpupConfigReg, OsCpupConfigInit}},
217 #endif
218 #if (OS_INCLUDE_SEM == YES)
219 {OS_MID_SEM, {OsSemConfigReg, OsSemConfigInit}},
220 #endif
221 #if (OS_INCLUDE_QUEUE == YES)
222 {OS_MID_QUEUE, {OsQueueConfigReg, OsQueueConfigInit}},
223 #endif
224 {OS_MID_APP, {NULL, PRT_AppInit}},
225
226 {OS_MID_BUTT, {NULL, NULL}},
227 };
228
229 /*
230 * 描述:OS模块注册、初始化运行函数
231 */
OsModuleConfigRun(enum OsinitPhaseId initPhaseId,U32 initPhase)232 U32 OsModuleConfigRun(enum OsinitPhaseId initPhaseId, U32 initPhase)
233 {
234 U32 idx = 0;
235 U32 ret = OS_OK;
236 while (g_moduleConfigTab[idx].moudleId != OS_MID_BUTT) {
237 if (g_moduleConfigTab[idx].moudleConfigFunc[initPhaseId] == NULL) {
238 idx++;
239 continue;
240 }
241 ret = g_moduleConfigTab[idx].moudleConfigFunc[initPhaseId]();
242 if (ret != OS_OK) {
243 break;
244 }
245 idx++;
246 }
247 return ret;
248 }
OsRegister(void)249 U32 OsRegister(void)
250 {
251 return OsModuleConfigRun(OS_REGISTER_ID, OS_REGISTER_PHASE);
252 }
253
254 /*
255 * 描述:OsInitialize阶段
256 */
OsInitialize(void)257 U32 OsInitialize(void)
258 {
259 return OsModuleConfigRun(OS_INIT_ID, OS_INITIALIZE_PHASE);
260 }
261
262 /*
263 * 描述:OsStart阶段
264 */
OsStart(void)265 U32 OsStart(void)
266 {
267 U32 ret;
268
269 #if (OS_INCLUDE_TICK == YES)
270 /* 表示系统在进行启动阶段,匹配MOUDLE_ID之后,标记进入TICK模块的启动 */
271 ret = OsTickStart();
272 if (ret != OS_OK) {
273 return ret;
274 }
275 #endif
276
277 #if (OS_INCLUDE_TASK == YES)
278 /* 表示系统在进行启动阶段,匹配MOUDLE_ID之后,标记进入任务模块的启动 */
279 ret = OsActivate();
280 #else
281 ret = OS_OK;
282 #endif
283
284 return ret;
285 }
286
OsConfigStart(void)287 S32 OsConfigStart(void)
288 {
289 U32 ret;
290
291 OsHwInit();
292
293 /* OS模块注册 */
294 ret = OsRegister();
295 if (ret != OS_OK) {
296 return (S32)ret;
297 }
298
299 /* OS模块初始化 */
300 ret = OsInitialize();
301 if (ret != OS_OK) {
302 return (S32)ret;
303 }
304
305 /* OS启动调度 */
306 ret = OsStart();
307 if (ret != OS_OK) {
308 return (S32)ret;
309 }
310
311 /* Execution should not reach this point */
312 return (S32)OS_ERROR;
313 }
314