• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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