• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1# UniProton 接口描述说明书
2## 1 简介
3    本文描述了UniProton对外提供的接口设计,重点描述了接口原型和字段定义等。本文档作为UniProton接口设计的基线文档,能够长期维护与使用。本文档将主要用于指导UniProton和所有使用UniProton接口的子系统的相关开发,也帮助测试人员了解UniProton提供的对外接口设计,支持相关开发和测试人员其完成UniProton及其内部各模块的开发和测试。
4### 1.1目的
5    本文主要用于指导UniProton的开发和测试人员了解UniProton对外提供的接口设计,以支持其完成UniProton各模块的开发和测试。该文档为UniProton接口设计的基线文档,长期维护与使用。
6### 1.2全量范围
7    本文档所列接口用于嵌入式产品。
8## 2 总体描述
9### 2.1 公共设计约定
10#### 2.1.1 处理器平台支持
11    UniProton支持各类处理器平台,当前仅支持cortex_m4芯片等,定义两个宏来识别一个确定的处理器平台:
12     OS_HARDWARE_PLATFORM:代表当前UniProton版本支持的处理器内核,它被赋值为以下枚举值之一:
13       OS_CORTEX_M4
14    基于各类处理器平台,UniProton向各类用户软件提供的基本统一的接口集合。对于一些具有特殊硬件功能的处理器,UniProton还为其提供相关的应用解决方案,相应地增加一些用户接口。
15    本文主要描述基于cortex_m4处理器硬件平台的UniProton接口。
16
17    #define OS_HARDWARE_PLATFORM    OS_CORTEX_M4
18    #define OS_CPU_TYPE             OS_STM32F407
19
20#### 2.1.2 功能裁剪
21    UniProton支持各项功能的裁减。其中,对于裁减与否不影响实时运行效率的功能,UniProton通过配置文件prt_config.h里的裁减宏来实现功能裁减,这种方式不要求重新编译UniProton库文件。
22    UniProton还有部分功能的裁减会影响实时运行效率,对此,UniProton在prt_buildef.h文件中提供裁减宏,改变裁减宏的值需要重新编译UniProton库文件。
23
24
25#### 2.1.3 基本数据类型
26    为了屏蔽各种处理器平台在数据类型定义上的差异,UniProton对C语言基本数据类型进行统一定义,供UniProton各功能模块及业务使用。基本数据类型定义为:
27
28    typedef unsigned char U8;
29    typedef unsigned short U16;
30    typedef unsigned int U32;
31    typedef unsigned long long U64;
32    typedef signed char S8;
33    typedef signed short S16;
34    typedef signed int S32;
35    typedef signed long long S64;
36
37#### 2.1.4 常用宏
38    UniProton还提供以下常用宏定义。
39    prt_typedef.h
40    #ifndef OS_SEC_ALW_INLINE
41    #define OS_SEC_ALW_INLINE
42    #endif
43    #ifndef INLINE
44    #define INLINE static __inline __attribute__((always_inline))
45    #endif
46    #ifndef OS_EMBED_ASM
47    #define OS_EMBED_ASM __asm__ __volatile__
48    #endif
49    #define ALIGN(addr, boundary) (((uintptr_t)(addr) + (boundary) - 1) & ~((uintptr_t)(boundary) - 1))
50    #define TRUNCATE(addr, size)  ((addr) & ~((uintptr_t)(size) - 1))
51    #endif
52    #define YES 1
53    #endif
54    #define NO 0
55    #ifndef FALSE
56    #define FALSE ((bool)0)
57    #endif
58    #ifndef TRUE
59    #define TRUE ((bool)1)
60    #endif
61    #ifndef NULL
62    #define NULL ((void *)0)
63    #endif
64    #define OS_ERROR   (U32)(-1)
65    #define OS_INVALID (-1)
66    #ifndef OS_OK
67    #define OS_OK 0
68    #endif
69    #ifndef LIKELY
70    #define LIKELY(x) __builtin_expect(!!(x), 1)
71    #endif
72    #ifndef UNLIKELY
73    #define UNLIKELY(x) __builtin_expect(!!(x), 0)
74    #endif
75## 3 接口定义
76### 3.1 prt接口
77#### 3.1.1 时钟模块
78##### 3.1.1.1 获取当前的64位time stamp计数(即系统运行的cycles)
79    【接口原型】
80    U64 PRT_ClkGetCycleCount64(void)
81    【功能描述】
82    获取当前的64位time stamp计数(即系统运行的cycles)。
83    【返回值】
84    [0,0xFFFFFFFFFFFFFFFF] 系统当前的cycle数
85    【参数说明】
86    无。
87    【注意事项】
88    获取的是64bit cycles 数据。
89
90##### 3.1.1.2 转换cycle为毫秒
91    【接口原型】
92    U64 PRT_ClkCycle2Ms(U64 cycle)
93    【功能描述】
94    转换cycle为毫秒。
95    【返回值】
96    [0,0xFFFFFFFFFFFFFFFF] 转换后的毫秒数。
97    【参数说明】
98    cycle [IN]  类型#U64,cycle数。
99    【注意事项】
100    None
101
102##### 3.1.1.3 转换cycle为微秒
103    【接口原型】
104    U64 PRT_ClkCycle2Us(U64 cycle)
105    【功能描述】
106    转换cycle为微秒。
107    【返回值】
108    [0,0xFFFFFFFFFFFFFFFF] 转换后的微秒数。
109    【参数说明】
110    cycle [IN]  类型#U64,cycle数。
111    【注意事项】
112    None
113
114##### 3.1.1.4 延迟时间(单位微秒)
115    【接口原型】
116    void PRT_ClkDelayUs(U32 delay)
117    【功能描述】
118    延迟时间(单位微秒)。
119    【返回值】
120121    【参数说明】
122    delay [IN]  类型#U32,延迟微秒数。
123    【注意事项】
124    None
125
126##### 3.1.1.5 延迟时间(单位毫秒)
127    【接口原型】
128    void PRT_ClkDelayMs(U32 delay)
129    【功能描述】
130    延迟时间(单位毫秒)。
131    @param delay [IN]  类型#U32,延迟毫秒数。
132    @retval 无
133    【返回值】
134135    【参数说明】
136    delay [IN]  类型#U32,延迟微秒数。
137    【注意事项】
138    None
139
140#### 3.1.2 硬中断模块
141##### 3.1.2.1 激活指定核号内的硬中断
142    【接口原型】
143    U32 PRT_HwiTrigger(U32 dstCore, HwiHandle hwiNum)
144    【功能描述】
145    激活指定核号内的软件可触发的硬中断
146    【返回值】
147    #OS_OK  0x00000000,硬中断激活成功。
148    #其它值,激活失败。
149    【参数说明】
150    dstCore [IN]  类型#U32,目标核号。目前只支持指定为本核。
151    hwiNum  [IN]  类型#HwiHandle,硬中断号,只支持软件可触发的中断号。
152    【注意事项】
153    None
154
155##### 3.1.2.2 清空中断请求位
156    【接口原型】
157    void PRT_HwiClearAllPending(void)
158    【功能描述】
159    清除所有的中断请求位。即放弃当前已触发中断的的响应。
160    【返回值】
161    无。
162    【参数说明】
163    无。
164    【注意事项】
165    None
166
167##### 3.1.2.3 清除硬中断的Pending位
168    【接口原型】
169    U32 PRT_HwiClearPendingBit(HwiHandle hwiNum)
170    【功能描述】
171    显式清除硬中断或事件的请求位,因为有的硬件响应中断后不会自动清Pending位。
172    【返回值】
173    #OS_OK  0x00000000,硬中断请求位清除成功。
174    #其它值,清除失败。
175    【参数说明】
176    hwiNum [IN]  类型#HwiHandle,硬中断号。
177    【注意事项】
178    None
179
180##### 3.1.2.4 屏蔽指定的硬中断
181    【接口原型】
182    U32 PRT_HwiDisable(HwiHandle hwiNum)
183    【功能描述】
184    禁止核响应指定硬中断的请求。
185    【返回值】
186    #OS_OK  0x00000000,硬中断去使能成功。
187    #其它值,硬中断去使能失败。
188    【参数说明】
189    hwiNum [IN]  类型#HwiHandle,依据不同的芯片,硬中断号或中断向量号,见注意事项。
190    【注意事项】
191    None
192
193##### 3.1.2.5 使能指定的硬中断
194    【接口原型】
195    U32 PRT_HwiEnable(HwiHandle hwiNum)
196    【功能描述】
197    允许核响应指定硬中断的请求。
198    【返回值】
199    #OS_OK  0x00000000,硬中断使能成功。
200    #其它值,硬中断使能失败。
201    【参数说明】
202    hwiNum [IN]  类型#HwiHandle,依据不同的芯片,硬中断号或中断向量号,见注意事项。
203    【注意事项】
204    对于不同芯片,此返回值代表的意义有所差异,差异细节见下面返回值说明
205
206##### 3.1.2.6 添加硬中断进入钩子
207    【接口原型】
208    U32 PRT_HwiAddEntryHook(HwiEntryHook hook)
209    【功能描述】
210    添加硬中断进入钩子。该钩子函数在进入硬中断ISR前被调用。
211    【返回值】
212    #OS_OK  0x00000000,硬中断使能成功。
213    #其它值,硬中断使能失败。
214    【参数说明】
215    hook [IN]  类型#HwiEntryHook,中断进入钩子函数。
216    【注意事项】
217    不同钩子函数间执行的先后顺序,不应当存在依赖关系。
218    不应在钩子函数里调用可能引起线程调度或阻塞的OS接口。
219    最大支持钩子数需静态配置
220
221##### 3.1.2.7 删除硬中断进入钩子
222    【接口原型】
223    U32 PRT_HwiDelEntryHook(HwiEntryHook hook)
224    【功能描述】
225    删除硬中断进入钩子。该钩子函数将停止在进入硬中断ISR前的调用。
226    【返回值】
227    #OS_OK  0x00000000,硬中断使能成功。
228    #其它值,硬中断使能失败。
229    【参数说明】
230    hook [IN]  类型#HwiEntryHook,中断进入钩子函数。
231    【注意事项】
232    不同钩子函数间执行的先后顺序,不应当存在依赖关系。
233    不应在钩子函数里调用可能引起线程调度或阻塞的OS接口。
234    最大支持钩子数需静态配置
235
236##### 3.1.2.8 添加硬中断退出钩子
237    【接口原型】
238    U32 PRT_HwiAddExitHook(HwiExitHook hook)
239    【功能描述】
240    添加硬中断退出钩子。该钩子函数在退出硬中断ISR后被调用。
241    【返回值】
242    #OS_OK  0x00000000,硬中断使能成功。
243    #其它值,硬中断使能失败。
244    【参数说明】
245    hook [IN]  类型#HwiExitHook,中断退出钩子函数。
246    【注意事项】
247    不同钩子函数间执行的先后顺序,不应当存在依赖关系。
248    不应在钩子函数里调用可能引起线程调度或阻塞的OS接口。
249    最大支持钩子数需静态配置
250
251##### 3.1.2.9 删除硬中断退出钩子
252    【接口原型】
253    U32 PRT_HwiDelExitHook(HwiExitHook hook)
254    【功能描述】
255    删除硬中断退出钩子。该钩子函数将停止在退出硬中断ISR后的调用。
256    【返回值】
257    #OS_OK  0x00000000,硬中断使能成功。
258    #其它值,硬中断使能失败。
259    【参数说明】
260    hook [IN]  类型#HwiExitHook,中断退出钩子函数。
261    【注意事项】
262    不同钩子函数间执行的先后顺序,不应当存在依赖关系。
263    不应在钩子函数里调用可能引起线程调度或阻塞的OS接口。
264    最大支持钩子数需静态配置
265
266##### 3.1.2.10 开中断
267    【接口原型】
268    uintptr_t PRT_HwiUnLock(void)
269    【功能描述】
270    开启全局可屏蔽中断。
271    【返回值】
272    开启全局中断前的中断状态值。
273    【参数说明】
274    无。
275    【注意事项】
276    None
277
278##### 3.1.2.11 关中断
279    【接口原型】
280    uintptr_t PRT_HwiLock(void)
281    【功能描述】
282    关闭全局可屏蔽中断。
283    【返回值】
284    关闭全局中断前的中断状态值。
285    【参数说明】
286    无。
287    【注意事项】
288    None
289
290##### 3.1.2.12 恢复中断状态接口
291    【接口原型】
292    void PRT_HwiRestore(uintptr_t intSave)
293    【功能描述】
294    恢复原中断状态寄存器。
295    【返回值】
296297    【参数说明】
298    intSave [IN]  类型#uintptr_t,关全局中断PRT_IntLock和开全局中断PRT_IntUnLock的返回值。
299    【注意事项】
300    该接口必须和关闭全局中断或者是开启全局中断接口成对使用,以关全局中断或者开全局中断操作的返回值为入参
301    以保证中断可以恢复到关全局中断或者开全局中断操作前的状态
302
303##### 3.1.2.13 设置硬中断属性接口
304    【接口原型】
305    U32 PRT_HwiSetAttr(HwiHandle hwiNum, HwiPrior hwiPrio, HwiMode mode)
306    【功能描述】
307    在创建硬中断前,必须要配置好硬中断的优先级和模式,包括独立型(#OS_HWI_MODE_ENGROSS)和
308    组合型(#OS_HWI_MODE_COMBINE)两种配置模式。
309    【返回值】
310    #OS_OK  0x00000000,硬中断属性设置成功。
311    #其它值,属性设置失败。
312    【参数说明】
313    hwiNum  [IN]  类型#HwiHandle,硬中断号。
314    hwiPrio [IN]  类型#HwiPrior,硬中断优先级。
315    mode    [IN]  类型#HwiMode,设置的中断模式,为独立型(#OS_HWI_MODE_ENGROSS)或者组合型(#OS_HWI_MODE_COMBINE)。
316    【注意事项】
317    OS已经占用的不能被使用
318
319##### 3.1.2.14 创建硬中断函数
320    【接口原型】
321    U32 PRT_HwiCreate(HwiHandle hwiNum, HwiProcFunc handler, HwiArg arg)
322    【功能描述】
323    注册硬中断的处理函数。
324    【返回值】
325    #OS_OK  0x00000000,硬中断创建成功。
326    #其它值,创建失败。
327    【参数说明】
328    hwiNum  [IN]  类型#HwiHandle,硬中断号。
329    handler [IN]  类型#HwiProcFunc,硬中断触发时的处理函数。
330    arg     [IN]  类型#HwiArg,调用硬中断处理函数时传递的参数。
331    【注意事项】
332    在调用该函数之前,请先确保已经设置了中断属性。
333    硬中断创建成功后,并不使能相应向量的中断,需要显式调用#PRT_HwiEnable单独使能。
334
335##### 3.1.2.15 删除硬中断函数
336    【接口原型】
337    U32 PRT_HwiDelete(HwiHandle hwiNum)
338    【功能描述】
339    屏蔽相应硬中断或事件,取消硬中断处理函数的注册。
340    【返回值】
341    #OS_OK  0x00000000,硬中断删除成功。
342    #其它值,删除失败。
343    【参数说明】
344    hwiNum [IN]  类型#HwiHandle,硬中断号。
345    【注意事项】
346    不能删除OS占用的中断号。
347
348#### 3.1.3 事件模块
349##### 3.1.3.1 读事件
350    【接口原型】
351    U32 PRT_EventRead(U32 eventMask, U32 flags, U32 timeOut, U32 *events)
352    【功能描述】
353    读取当前任务的指定掩码为eventMask的事件,可以一次性读取多个事件。事件读取成功后,被读取的事件将被清除。
354    【返回值】
355    #OS_OK  0x00000000,操作成功。
356    #其它值,操作失败。
357    【参数说明】
358    eventMask [IN]  类型#U32,设置要读取的事件掩码,每个bit位对应一个事件,1表示要读取。该入参不能为0。
359    flags     [IN]  类型#U32,读取事件所采取的策略, 为(OS_EVENT_ANY,OS_EVENT_ALL)中一个和(OS_EVENT_WAIT,
360    OS_EVENT_NOWAIT)中的一个标识或的结果。#OS_EVENT_ALL表示期望接收eventMask中的所有事件,
361    #OS_EVENT_ANY表示等待eventMask中的任何一个事件。#OS_EVENT_WAIT表示若期望事件没有发生,等待接收,
362    #OS_EVENT_NOWAIT表示若期望事件没有发生,将不会等待接收。
363    timeOut   [IN]  类型#U32,等待超时时间,单位为tick,取值(0~0xFFFFFFFF]。当flags标志为OS_EVENT_WAIT,
364    这个参数才有效。若值为#OS_EVENT_WAIT_FOREVER,则表示永久等待。
365    events    [OUT] 类型#U32 *,用于保存接收到的事件的指针。如果不需要输出,可以填写NULL。
366    【注意事项】
367    读取模式可以选择读取任意事件和读取所有事件。
368    等待模式可以选择等待和不等待,可等待指定时间、永久等待。
369    当读取事件没有发生且为等待模式时,会发生任务调度,锁任务状态除外。
370    不能在IDLE任务中读事件,需要用户自行保证。
371    不能在系统初始化之前调用读事件接口。
372
373##### 3.1.3.2 写事件
374    【接口原型】
375    U32 PRT_EventWrite(U32 taskId, U32 events)
376    【功能描述】
377    写任务ID为taskId的指定事件,可以一次性写多个事件,可以在UniProton接管的中断中调用。
378    【返回值】
379    #OS_OK  0x00000000,操作成功。
380    #其它值,操作失败。
381    【参数说明】
382    taskId [IN]  类型#U32,任务ID,表示要对某个任务进行写事件操作。
383    events [IN]  类型#U32,事件号,每个bit对应一个事件。
384    【注意事项】
385    若指定任务正在等待读取写入的事件,则会激活指定任务,并发生任务调度。
386    不能向IDLE任务写事件,需要用户自行保证。
387
388#### 3.1.4 异常模块
389##### 3.1.4.1 用户注册异常处理钩子
390    【接口原型】
391    U32 PRT_ExcRegHook(ExcProcFunc hook)
392    【功能描述】
393    注册异常处理钩子。
394    【返回值】
395    #OS_OK  0x00000000,注册失败。
396    #其它值,注册失败。
397    【参数说明】
398    hook [IN]  类型#ExcProcFunc,钩子函数。
399    【注意事项】
400    当多次注册该钩子时,最后一次注册的钩子生效。
401    注册的钩子函数不能为空,即一旦注册钩子函数,不能通过注册空函数将其取消。
402
403#### 3.1.5 背景任务模块
404##### 3.1.5.1 注册IDLE循环中调用的钩子
405    【接口原型】
406    U32 PRT_IdleAddHook(IdleHook hook)
407    【功能描述】
408    注册在IDLE任务中调用的钩子函数。
409    【返回值】
410    #OS_OK  0x00000000,操作成功。
411    #其它值,操作失败。
412    【参数说明】
413    hook [OUT] 类型#IdleHook,IDLE钩子函数,该参数不能为空。
414    【注意事项】
415    钩子中不能调用引起任务阻塞或切换的函数。
416
417##### 3.1.5.2 删除IDLE循环中调用的钩子
418    【接口原型】
419    U32 PRT_IdleDelHook(IdleHook hook)
420    【功能描述】
421    删除在IDLE任务中调用的钩子函数。
422    【返回值】
423    #OS_OK  0x00000000,操作成功。
424    #其它值,操作失败。
425    【参数说明】
426    hook [OUT] 类型#IdleHook,IDLE钩子函数,该参数不能为空。
427    【注意事项】
428    None
429
430##### 3.1.5.3 注册IDLE循环进入前调用的钩子
431    【接口原型】
432    U32 PRT_IdleAddPrefixHook(IdleHook hook)
433    【功能描述】
434    为本核注册IDLE循环进入前调用的钩子,该钩子只会被调用一次。
435    【返回值】
436    #OS_OK                          0x00000000,操作成功。
437    【参数说明】
438    hook [IN]  类型#IdleHook,钩子函数。
439    【注意事项】
440    注册的钩子只在进入IDLE循环前执行一次。
441    若任务未裁剪,则作用的是任务IDLE循环。
442    IDLE任务钩子中使用矢量寄存器需要在前置钩子中调用#PRT_TaskCpSaveCfg接口设置矢量操作上下文保护区。
443
444#### 3.1.6 队列模块
445##### 3.1.6.1 创建队列
446    【接口原型】
447    U32 PRT_QueueCreate(U16 nodeNum, U16 maxNodeSize, U32 *queueId)
448    【功能描述】
449    创建一个队列,创建时可以设定队列长度和队列结点大小。
450    【返回值】
451    #OS_OK  0x00000000,操作成功。
452    #其它值,操作失败。
453    【参数说明】
454    nodeNum     [IN]  类型#U16,队列节点个数,不能为0。
455    maxNodeSize [IN]  类型#U16,每个队列结点的大小。
456    queueId     [OUT] 类型#U32 *,存储队列ID,ID从1开始。
457    【注意事项】
458    每个队列节点的大小的单位是BYTE。
459    每个队列节点的长度自动做2字节对齐。
460    每个队列节点的长度不能大于0xFFFA。
461
462##### 3.1.6.2 读队列
463    【接口原型】
464    U32 PRT_QueueRead(U32 queueId, void *bufferAddr, U32 *len, U32 timeOut)
465    【功能描述】
466    读取指定队列中的数据。将读取到的数据存入bufferAddr地址,bufferAddr地址和读取数据大小由用户传入。
467    【返回值】
468    #OS_OK  0x00000000,操作成功。
469    #其它值,操作失败。
470    【参数说明】
471    queueId    [IN]  类型#U32,队列ID。
472    bufferAddr [OUT] 类型#void *,读取存放队列中数据的起始地址。
473    len        [I/O] 类型#U32 *,传入BUF的大小,输出实际消息的大小。
474    timeOut    [IN]  类型#U32,超时时间。
475    【注意事项】
476    队列读取才采用FIFO模式,即先入先出,读取队列中最早写入的数据(相对于队列节点是先后顺序)。
477    如果bufferSize大于队列中实际消息的大小,则只返回实际大小的数据,否则只读取bufferSize大小的数据。
478    bufferSize大小的单位是BYTE。
479    阻塞模式不能在idle钩子使用,需用户保证。
480    在osStart之前不能调用该接口,需用户保证。
481
482##### 3.1.6.3 写队列
483    【接口原型】
484    U32 PRT_QueueWrite(U32 queueId, void *bufferAddr, U32 bufferSize, U32 timeOut, U32 prio)
485    【功能描述】
486    向指定队列写数据。将bufferAddr地址中bufferSize大小的数据写入到队列中。
487    【返回值】
488    #OS_OK  0x00000000,操作成功。
489    #其它值,操作失败。
490    【参数说明】
491    queueId    [IN]  类型#U32,队列ID。
492    bufferAddr [IN]  类型#void *,写到队列中数据的起始地址。
493    bufferSize [IN]  类型#U32,写到队列中数据的大小。
494    timeOut    [IN]  类型#U32,超时时间。
495    prio       [IN]  类型#U32,优先级, 取值OS_QUEUE_NORMAL或OS_QUEUE_URGENT。
496    【注意事项】
497    需保证bufferSize大小小于或等于队列结点大小。
498    bufferSize大小的单位是BYTE。
499    阻塞模式不能在idle钩子使用,需用户保证。
500    在osStart之前不能调用该接口,需用户保证。
501
502##### 3.1.6.4 删除队列
503    【接口原型】
504    U32 PRT_QueueDelete(U32 queueId)
505    【功能描述】
506    删除一个消息队列。删除后队列资源被回收。
507    【返回值】
508    #OS_OK  0x00000000,操作成功。
509    #其它值,操作失败。
510    【参数说明】
511    queueId [IN]  类型#U32,队列ID。
512    【注意事项】
513    不能删除未创建的队列。
514    删除同步队列时,必须确保任务阻塞于该队列,且无被激活后还没及时操作队列的任务,否则删除队列失败。
515
516##### 3.1.6.5 获取队列的历史最大使用长度
517    【接口原型】
518    U32 PRT_QueueGetUsedPeak(U32 queueId, U32 *queueUsedNum)
519    【功能描述】
520    获取从队列创建到删除前的历史最大使用长度。
521    【返回值】
522    #OS_OK  0x00000000,操作成功。
523    #其它值,操作失败。
524    【参数说明】
525    queueId      [IN]  类型#U32,队列ID
526    queueUsedNum [OUT] 类型#U32 *,队列节点使用峰值
527    【注意事项】
528    峰值在队列删除前,不会被清零。
529
530##### 3.1.6.6 获取指定源PID的待处理消息个数
531    【接口原型】
532    U32 PRT_QueueGetNodeNum(U32 queueId, U32 taskPid, U32 *queueNum)
533    【功能描述】
534    从指定队列中,获取指定源PID的待处理消息个数。
535    【返回值】
536    #OS_OK  0x00000000,操作成功。
537    #其它值,操作失败。
538    【参数说明】
539    queueId  [IN]  类型#U32,队列ID。
540    taskPid  [IN]  类型#U32,线程PID。
541    queueNum [OUT] 类型#U32 *,待处理的消息个数。
542    【注意事项】
543    PID为OS_QUEUE_PID_ALL时,表示获取所有待处理的消息个数
544    PID的合法性不做判断,不合法的PID获取的消息个数为0
545
546#### 3.1.7 信号量模块
547##### 3.1.7.1 创建一个计数型信号量
548    【接口原型】
549    U32 PRT_SemCreate(U32 count, SemHandle *semHandle)
550    【功能描述】
551    根据用户指定的计数值,创建一个计数型信号量,设定初始计数器数值,唤醒方式为FIFO。
552    【返回值】
553    #OS_OK  0x00000000,操作成功。
554    #其它值,操作失败。
555    【参数说明】
556    count     [IN]  类型#U32,计数器初始值,取值范围为[0, 0xFFFFFFFE]。
557    semHandle [OUT] 类型#SemHandle *,输出信号量句柄。
558    【注意事项】
559    创建是否成功会受到"核内信号量裁剪开关"和"最大支持信号量"配置项的限制。
560
561##### 3.1.7.2 删除一个信号量
562    【接口原型】
563    U32 PRT_SemDelete(SemHandle semHandle)
564    【功能描述】
565    删除用户传入的信号量句柄指定的信号量,如果有任务阻塞于该信号量,则删除失败。
566    【返回值】
567    #OS_OK  0x00000000,操作成功。
568    #其它值,操作失败。
569    【参数说明】
570    semHandle [IN]  类型#SemHandle,信号量句柄,来源于信号量创建成功的输出值。
571    【注意事项】
572    None
573
574##### 3.1.7.3 获取信号量计数器数值
575    【接口原型】
576    U32 PRT_SemGetCount(SemHandle semHandle, U32 *semCnt)
577    【功能描述】
578    根据用户输入信号量句柄和计数值,获取信号量计数器数值。
579    【返回值】
580    #OS_OK  0x00000000,获取信号量计数器值成功。
581    #其它值,获取失败。
582    【参数说明】
583    semHandle [IN]  类型#SemHandle,信号量句柄,来源于信号量创建成功的输出值。
584    semCnt    [OUT] 类型#U32 *,保存信号量计数值指针。
585    【注意事项】
586    None
587
588##### 3.1.7.4 等待一个信号量
589    【接口原型】
590    U32 PRT_SemPend(SemHandle semHandle, U32 timeout)
591    【功能描述】
592    等待用户传入信号量句柄指定的信号量,若其计数器值大于0,则直接减1返回成功。否则任务阻塞,
593    等待其他线程发布该信号量,等待超时时间可设定。
594    【返回值】
595    #OS_OK  0x00000000,操作成功。
596    #其它值,操作失败。
597    【参数说明】
598    semHandle [IN]  类型#SemHandle,信号量句柄,来源于信号量创建成功的输出值。
599    timeout   [IN]  类型#U32,等待时间限制,单位为tick,取值范围为[0, 0xffffffff]。#OS_NO_WAIT或0表示不等待,
600    #OS_WAIT_FOREVER或0xffffffff表示永久等待。
601    【注意事项】
602    在osStart之前不能调用该接口。
603    等待时间可以选择零等待、等待特定时间、永久等待。
604    该接口只能被任务调用。
605    在锁任务情况下,用户要PEND信号量,要保证当前有可用信号量资源。
606
607##### 3.1.7.5 发布指定的信号量
608    【接口原型】
609    U32 PRT_SemPost(SemHandle semHandle)
610    【功能描述】
611    发布指定的信号量,若没有任务等待该信号量,则直接将计数器加1返回。
612    否则根据唤醒方式唤醒相应的阻塞任务,FIFO方式唤醒最早阻塞的任务,优先级方式唤醒阻塞在此信号量的最高优先级任务。
613    【返回值】
614    #OS_OK  0x00000000,操作成功。
615    #其它值,操作失败。
616    【参数说明】
617    semHandle [IN]  类型#SemHandle,信号量句柄,来源于信号量创建成功的输出值。
618    【注意事项】
619    在osStart之前不能调用该接口。
620    在未锁任务的情况下,如果唤醒的任务优先级高于当前任务,则会立刻发生任务切换。
621    发生任务切换时,如果支持优先级唤醒方式,且创建信号量时指定唤醒方式为优先级,
622
623##### 3.1.7.6 获取阻塞在指定核内信号量上的任务PID清单
624    【接口原型】
625    U32 PRT_SemGetPendList(SemHandle semHandle, U32 *tskCnt, U32 *pidBuf, U32 bufLen)
626    【功能描述】
627    根据用户指定的核内信号量句柄,获取阻塞在指定核内信号量上的任务PID清单。
628    若有任务阻塞于该核内信号量,则返回阻塞于该核内信号量的任务数目,以及相应任务的PID。
629    若没有任务阻塞于该核内信号量,则返回阻塞于该核内信号量的任务数目为0。
630    【返回值】
631    #OS_OK  0x00000000,操作成功。
632    #其它值,操作失败。
633    【参数说明】
634    semHandle [IN]  类型#SemHandle,信号量句柄,来源于信号量创建成功的输出值。
635    tskCnt    [OUT] 类型#U32 *,阻塞于该核内信号量的任务数。
636    pidBuf    [OUT] 类型#U32 *,由用户指定的内存区域首地址,用于存储阻塞于指定核内信号量的任务PID。
637    bufLen    [IN]  类型#U32,用户指定的内存区域的长度(单位:字节)。
638    【注意事项】
639    用户应保证存储任务PID清单的内存空间足够大,建议将bufLen配置为(#OS_TSK_MAX_SUPPORT_NUM + 1)
640
641##### 3.1.7.7 获取信号量详细信息:信号量当前计数值,信号量持有者(最后一次pend成功的线程ID),信号量唤醒方式,信号量类型
642    【接口原型】
643    U32 PRT_SemGetInfo(SemHandle semHandle, struct SemInfo *semInfo)
644    【功能描述】
645    根据用户输入信号量句柄获取信号量详细信息。
646    【返回值】
647    #OS_OK  0x00000000,获取信号量计数器值成功。
648    #其它值,获取失败。
649    【参数说明】
650    semHandle [IN]  类型#SemHandle,信号量句柄,来源于信号量创建成功的输出值。
651    semInfo   [OUT] 类型#struct SemInfo *,信号量详细信息:count--信号量计数,owner--信号量占用者,
652    mode--信号量唤醒方式,type--信号量类型。
653    【注意事项】
654    None
655
656#### 3.1.8 系统模块
657##### 3.1.8.1 复位单板
658    【接口原型】
659    void PRT_SysReboot(void)
660    【功能描述】
661    复位单板,程序重新加载执行。
662    【返回值】
663664    【参数说明】
665    无。
666    【注意事项】
667    并非直接复位单板,而是关中断,等待看门狗复位。
668    用户可以通过配置项OS_SYS_REBOOT_HOOK挂接复位函数。
669
670##### 3.1.8.2 获取当前核ID
671    【接口原型】
672    U32 PRT_SysGetCoreId(void)
673    【功能描述】
674    获取当前核ID。
675    【返回值】
676    物理核ID。
677    【参数说明】
678    无。
679    【注意事项】
680    获取的核ID为硬件寄存器中的ID号。
681
682##### 3.1.8.3 业务给OS传递RND值,用作后续相关功能模块的保护
683    【接口原型】
684    U32 PRT_SysSetRndNum(enum SysRndNumType type, U32 rndNum)
685    【功能描述】
686    None
687    【返回值】
688    #OS_OK  0x00000000,操作成功。
689    #其它值,操作失败。
690    【参数说明】
691    type   [IN]  类型#enum SysRndNumType,设置的目标RND值的类型。
692    rndNum [IN]  类型#U32,传递的RND值。
693    【注意事项】
694    栈保护随机值设置必须在PRT_HardBootInit中调用。
695
696##### 3.1.8.4 获取OS的版本号
697    【接口原型】
698    char *PRT_SysGetOsVersion(void)
699    【功能描述】
700    获取OS的版本号。版本编号格式为UniProton xx.xx VERSIONID(XXX)。
701    【返回值】
702    指向OS版本号的字符串指针。
703    【参数说明】
704    无。
705    【注意事项】
706    None
707
708#### 3.1.9 任务模块
709##### 3.1.9.1 创建任务,但不激活任务
710    【接口原型】
711    U32 PRT_TaskCreate(TskHandle *taskPid, struct TskInitParam *initParam)
712    【功能描述】
713    创建一个任务。该任务不加入就绪队列,只处于挂起状态,用户需要激活该任务需要通过调用PRT_TaskResume函数将其激活。
714    【返回值】
715    #OS_OK  0x00000000,任务创建成功。
716    #其它值,创建失败。
717    【参数说明】
718    taskPid   [OUT] 类型#TskHandle *,保存任务PID。
719    initParam [IN]  类型#struct TskInitParam *,任务创建参数,
720    其结构体中的成员参数stackAddr传入时必须进行初始化,若不采用用户配置的独立任务栈进行栈空间分配,
721    该成员必须初始化为0。
722    【注意事项】
723    任务创建时,会对之前自删除任务的任务控制块和任务栈进行回收,用户独立配置的任务栈除外。
724    任务名的最大长度为16字节,含结束符。
725    同一核内任务名不允许重复。
726    若指定的任务栈大小为0,则使用配置项#OS_TSK_DEFAULT_STACK_SIZE指定的默认的任务栈大小。
727    任务栈的大小必须按16字节大小对齐。确定任务栈大小的原则是,够用就行:多了浪费,少了任务栈溢出。
728    具体多少取决于需要消耗多少的栈内存,视情况而定:函数调用层次越深,栈内存开销越大,
729    局部数组越大,局部变量越多,栈内存开销也越大。
730    用户配置的任务栈首地址需16字节对齐。
731    用户配置的任务栈空间需由用户保证其合法性,即对可cache空间的地址用户需要保证其任务栈首地址及栈大小cache line对齐,系统不做对齐处理,并在使用后需由用户进行释放。
732    任务创建时,任务创建参数中的任务栈大小配置建议不要使用最小任务栈大小OS_TSK_MIN_STACK_SIZE,
733    该项只是包含任务上下文预留的栈空间,任务调度时额外的任务开销需要由用户自行保证足够的任务栈空间配置。
734
735##### 3.1.9.2 恢复任务
736    【接口原型】
737    U32 PRT_TaskResume(TskHandle taskPid)
738    【功能描述】
739    恢复挂起的任务。
740    【返回值】
741    #OS_OK  0x00000000,恢复任务成功。
742    #其它值,恢复任务失败。
743    【参数说明】
744    taskPid [IN]  类型#TskHandle,任务PID。
745    【注意事项】
746    在osStart之前不能调用该接口。
747    若任务仍处于延时、阻塞态,则只是取消挂起态,并不加入就绪队列。
748
749##### 3.1.9.3 挂起任务
750    【接口原型】
751    U32 PRT_TaskSuspend(TskHandle taskPid)
752    【功能描述】
753    挂起指定的任务,任务将从就绪队列中被删除。
754    【返回值】
755    #OS_OK  0x00000000,挂起任务成功。
756    #其它值,挂起任务失败。
757    【参数说明】
758    taskPid [IN]  类型#TskHandle,任务PID。
759    【注意事项】
760    在osStart之前不能调用该接口。
761    若为当前任务且已锁任务,则不能被挂起。
762    IDLE任务不能被挂起。
763
764##### 3.1.9.4 删除任务
765    【接口原型】
766    U32 PRT_TaskDelete(TskHandle taskPid)
767    【功能描述】
768    删除指定的任务,释放任务栈和任务控制块资源。
769    【返回值】
770    #OS_OK  0x00000000,删除任务成功。
771    #其它值,删除任务失败。
772    【参数说明】
773    taskPid [IN]  类型#TskHandle,任务PID。
774    【注意事项】
775    若为自删除,则任务控制块和任务栈在下一次创建任务时才回收。
776    对于任务自删除,处理该任务相关的信号量和接收到的消息会强制删除。
777    任务自删除时,删除钩子不允许进行pend信号量、挂起等操作。
778
779##### 3.1.9.5 延迟正在运行的任务
780    【接口原型】
781    U32 PRT_TaskDelay(U32 tick)
782    【功能描述】
783    延迟当前运行任务的执行。任务延时等待指定的Tick数后,重新参与调度。
784    【返回值】
785    #OS_OK  0x00000000,任务延时成功。
786    #其它值,延时任务失败。
787    【参数说明】
788    tick [IN]  类型#U32,延迟的Tick数。
789    【注意事项】
790    在osStart之前不能调用该接口。
791    硬中断处理中,或已锁任务,则延时操作失败。
792    若传入参数0,且未锁任务调度,则顺取同优先级队列中的下一个任务执行。如没有同级的就绪任务,
793    则不发生任务调度,继续执行原任务。
794
795##### 3.1.9.6 锁任务调度
796    【接口原型】
797    void PRT_TaskLock(void)
798    【功能描述】
799    锁任务调度。若任务调度被锁,则不发生任务切换。
800    【返回值】
801802    【参数说明】
803    无。
804    【注意事项】
805    只是锁任务调度,并不关中断,因此任务仍可被中断打断。
806    执行此函数则锁计数值加1,解锁则锁计数值减1。因此,必须与#PRT_TaskUnlock配对使用。
807
808##### 3.1.9.7 解锁任务调度
809    【接口原型】
810    void PRT_TaskUnlock(void)
811    【功能描述】
812    任务锁计数值减1。若嵌套加锁,则只有锁计数值减为0才真正的解锁了任务调度。
813    【返回值】
814815    【参数说明】
816    无。
817    【注意事项】
818    在osStart之前不能调用该接口。
819    执行此函数则锁计数值加1,解锁则锁计数值减1。因此,必须与#PRT_TaskLock配对使用。
820
821##### 3.1.9.8 获取当前任务PID
822    【接口原型】
823    U32 PRT_TaskSelf(TskHandle *taskPid)
824    【功能描述】
825    获取处于运行态的任务PID。
826    【返回值】
827    #OS_OK  0x00000000,获取成功。
828    #其它值,获取失败。
829    【参数说明】
830    taskPid [OUT] 类型#TskHandle *,保存任务PID。
831    【注意事项】
832    硬中断处理中,也可获取当前任务PID,即被中断打断的任务。
833    在任务切换钩子处理中调用时,获取的是切入任务的ID。
834
835##### 3.1.9.9 获取任务状态
836    【接口原型】
837    TskStatus PRT_TaskGetStatus(TskHandle taskPid)
838    【功能描述】
839    获取指定任务的状态。
840    【返回值】
841    #(TskStatus)OS_INVALID    返回失败。
842    #任务状态 返回成功。
843    【参数说明】
844    taskPid [IN]  类型#TskHandle,任务PID。
845    【注意事项】
846    None
847
848##### 3.1.9.10 获取任务信息
849    【接口原型】
850    U32 PRT_TaskGetInfo(TskHandle taskPid, struct TskInfo *taskInfo)
851    【功能描述】
852    获取指定任务的信息。
853    【返回值】
854    #OS_OK  0x00000000,获取成功。
855    #其它值,获取失败。
856    【参数说明】
857    taskPid  [IN]  类型#TskHandle,任务PID。
858    taskInfo [OUT] 类型#struct TskInfo *,保存任务信息。
859    【注意事项】
860    若获取当前任务的信息,则只在硬中断、异常的处理中才有意义,
861    由于任务切换时,上下文信息也保存在任务栈中,因此任务信息中的SP是保存上下文之后的实际的SP值。
862
863##### 3.1.9.11 获取优先级
864    【接口原型】
865    U32 PRT_TaskGetPriority(TskHandle taskPid, TskPrior *taskPrio)
866    【功能描述】
867    获取指定任务的优先级。
868    【返回值】
869    #OS_OK  0x00000000,获取成功。
870    #其它值,获取失败。
871    【参数说明】
872    taskPid  [IN]  类型#TskHandle,任务PID。
873    taskPrio [OUT] 类型#TskPrior *,保存任务优先级指针。
874    【注意事项】
875    None
876
877##### 3.1.9.12 设置优先级
878    【接口原型】
879    U32 PRT_TaskSetPriority(TskHandle taskPid, TskPrior taskPrio)
880    【功能描述】
881    设置指定任务的优先级。
882    【返回值】
883    #OS_OK  0x00000000,设置成功。
884    #其它值,设置失败。
885    【参数说明】
886    taskPid  [IN]  类型#TskHandle,任务PID。
887    taskPrio [IN]  类型#TskPrior,任务优先级。
888    【注意事项】
889    在osStart之前不能调用该接口。
890    若设置的优先级高于当前运行的任务,则可能引发任务调度。
891    若调整当前运行任务的优先级,同样可能引发任务调度。
892    若任务发生优先级继承,或者任务阻塞在互斥信号量或优先级唤醒模式的信号量上,不可以设置任务的优先级。
893
894##### 3.1.9.13 查询本核指定任务正在PEND的信号量
895    【接口原型】
896    U32 PRT_TaskGetPendSem(TskHandle taskId, U16 *semId, U16 *pendState)
897    【功能描述】
898    根据任务状态和任务控制块,判断任务是否在PEND信号量,以及PEND的信号量ID。
899    【返回值】
900    #OS_OK  0x00000000,查询成功。
901    #其它值,查询失败。
902    【参数说明】
903    taskId    [IN]  类型#TskHandle,任务PID。
904    semId     [OUT] 类型#U16 *,任务PEND的信号量ID或者#OS_INVALID。
905    pendState [OUT] 类型#U16 *,任务的PEND状态:0,#OS_TSK_FSEM_PEND,#OS_TSK_PEND, #OS_TSK_MCSEM_PEND。
906    【注意事项】
907    用户应先判断PEND状态,状态为0表明任务没有被信号量阻塞。
908
909##### 3.1.9.14 查询任务名
910    【接口原型】
911    U32 PRT_TaskGetName(TskHandle taskId, char **name)
912    【功能描述】
913    根据任务PID,查询任务名。
914    【返回值】
915    #OS_OK  0x00000000,查询成功。
916    #其它值,查询失败。
917    【参数说明】
918    taskId  [IN]  类型#TskHandle,任务ID。
919    name [OUT] 类型#char **,保存任务名字符串的首地址。
920    【注意事项】
921    在osStart之前不能调用该接口。
922    不能查询ID不合法的任务名。
923    若查询没有创建的任务名,查询失败。
924
925##### 3.1.9.15 注册任务切换钩子
926    【接口原型】
927    U32 PRT_TaskAddSwitchHook(TskSwitchHook hook)
928    【功能描述】
929    注册任务切换钩子函数。钩子函数在切入新任务前被调用。
930    【返回值】
931    #OS_OK  0x00000000,查询成功。
932    #其它值,查询失败。
933    【参数说明】
934    hook [IN]  类型#TskSwitchHook,任务切换钩子函数。
935    【注意事项】
936    不同钩子函数间执行的先后顺序,不应当存在依赖关系。
937    不应在任务切换钩子里进行可能引起任务调度的处理,如:任务延时、P信号量等。
938
939##### 3.1.9.16 取消任务切换钩子
940    【接口原型】
941    U32 PRT_TaskDelSwitchHook(TskSwitchHook hook)
942    【功能描述】
943    取消指定的任务切换钩子。钩子函数在切入新任务前被调用。
944    【返回值】
945    #OS_OK  0x00000000,查询成功。
946    #其它值,查询失败。
947    【参数说明】
948    hook [IN]  类型#TskSwitchHook,任务切换钩子函数。
949    【注意事项】
950    None
951
952#### 3.1.10 Tick中断
953##### 3.1.10.1 获取每秒钟对应的Tick数
954    【接口原型】
955    U64 PRT_TickGetCount(void)
956    【功能描述】
957    获取当前的tick计数。
958    【返回值】
959    [0,0xFFFFFFFFFFFFFFFF] 当前的tick计数。
960    【参数说明】
961    无。
962    【注意事项】
963    None
964
965#### 3.1.11 定时器模块
966##### 3.1.11.1 创建定时器
967    【接口原型】
968    U32 PRT_TimerCreate(struct TimerCreatePara *createPara, TimerHandle *tmrHandle)
969    【功能描述】
970    创建一个属性为createPara的定时器,返回定时器逻辑ID tmrHandle。
971    【返回值】
972    #OS_OK  0x00000000,定时器创建成功。
973    #其它值,创建失败。
974    【参数说明】
975    createPara [IN]  类型#struct TimerCreatePara *,定时器创建参数
976    tmrHandle  [OUT] 类型#TimerHandle *,定时器句柄
977    【注意事项】
978    如果用户打开Tick开关则可创建硬件定时器个数少一个。
979    中断处理函数handler的第一个参数是创建的定时器的逻辑编号。
980    定时器创建成功后并不立即开始计数,需显式调用#PRT_TimerStart或者#PRT_TimerRestart启动。
981    对于周期定时模式的定时器,建议用户不要把定时间隔设置的过低,避免一直触发定时器的处理函数。
982    struct TimerCreatePara参数里面的interval元素表示定时器周期,软件定时器单位是ms,
983
984##### 3.1.11.2 删除定时器
985    【接口原型】
986    U32 PRT_TimerDelete(U32 mid, TimerHandle tmrHandle)
987    【功能描述】
988    释放一个定时器逻辑ID为tmrHandle的定时器资源。
989    【返回值】
990    #OS_OK  0x00000000,定时器删除成功。
991    #其它值,删除失败。
992    【参数说明】
993    mid       [IN]  类型#U32,模块号,当前未使用,忽略
994    tmrHandle [IN]  类型#TimerHandle,定时器句柄,通过PRT_TimerCreate接口获取
995    【注意事项】
996    硬件定时器删除后将停止计数。
997    删除处于超时状态下的软件定时器时,OS采用延时删除的方式。详细说明请见手册注意事项。
998
999##### 3.1.11.3 启动定时器
1000    【接口原型】
1001    U32 PRT_TimerStart(U32 mid, TimerHandle tmrHandle)
1002    【功能描述】
1003    将定时器逻辑ID为tmrHandle的定时器由创建状态变成启动状态。
1004    【返回值】
1005    #OS_OK  0x00000000,定时器启动成功。
1006    #其它值,启动失败。
1007    【参数说明】
1008    mid       [IN]  类型#U32,模块号,当前未使用,忽略
1009    tmrHandle [IN]  类型#TimerHandle,定时器句柄,通过#PRT_TimerCreate接口获取
1010    【注意事项】
1011    创建后初次启动定时器时,从设置的值开始计数;如果重复启动或者启动后停止然后再启动,
1012    对于全局硬件定时器,无论是第一次启动还是重复启动,下一次启动都从初始值开始计时。
1013    对于单次触发模式,触发一次后,可以调用启动接口再次启动该定时器,时间间隔为设置的时间间隔。
1014    启动处于超时状态下的软件定时器时,OS采用延时启动的方式。详细说明请见手册注意事项。
1015
1016##### 3.1.11.4 停止定时器
1017    【接口原型】
1018    U32 PRT_TimerStop(U32 mid, TimerHandle tmrHandle)
1019    【功能描述】
1020    停止定时器逻辑ID为tmrHandle的定时器计数,使定时器由计时状态变成创建状态。
1021    【返回值】
1022    #OS_OK  0x00000000,定时器停止成功。
1023    #其它值,停止失败。
1024    【参数说明】
1025    mid       [IN]  类型#U32,模块号,当前未使用,忽略
1026    tmrHandle [IN]  类型#TimerHandle,定时器句柄,通过#PRT_TimerCreate接口获取
1027    【注意事项】
1028    定时器停止后,下一次启动将重新从停止点的计数值开始计数。
1029    不能停止未启动的定时器。
1030    停止处于超时状态下的软件定时器时,OS采用延时停止的方式。详细说明请见手册注意事项。
1031    核内硬件定时器在停止过程中如果发生超时,则剩余时间为0,但不会响应定时器处理函数。
1032
1033##### 3.1.11.5 重启定时器
1034    【接口原型】
1035    U32 PRT_TimerRestart(U32 mid, TimerHandle tmrHandle)
1036    【功能描述】
1037    重启定时器逻辑ID为tmrHandle的定时器计数,对于停止过的定时器,相当于恢复到刚创建时的定时时长开始计时。
1038    【返回值】
1039    #OS_OK  0x00000000,定时器重启成功。
1040    #其它值,重启失败。
1041    【参数说明】
1042    mid       [IN]  类型#U32,模块号,当前未使用,忽略
1043    tmrHandle [IN]  类型#TimerHandle,定时器句柄,通过#PRT_TimerCreate接口获取
1044    【注意事项】
1045    重启处于超时状态下的软件定时器时,OS采用延时重启的方式。详细说明请见手册注意事项。
1046
1047##### 3.1.11.6 定时器剩余超时时间查询
1048    【接口原型】
1049    U32 PRT_TimerQuery(U32 mid, TimerHandle tmrHandle, U32 *expireTime)
1050    【功能描述】
1051    输入定时器句柄tmrHandle,获得对应定时器超时剩余时间expireTime。
1052    【返回值】
1053    #OS_OK  0x00000000,定时器剩余超时时间查询成功。
1054    #其它值,查询失败。
1055    【参数说明】
1056    mid        [IN]  类型#U32,模块号,当前未使用,忽略
1057    tmrHandle  [IN]  类型#TimerHandle,定时器句柄,通过#PRT_TimerCreate接口获取
1058    expireTime [OUT] 类型#U32 *,定时器的剩余的超时时间,共享和私有硬件定时器单位us,软件定时器单位ms
1059    【注意事项】
1060    软件定时器单位毫秒,核内和全局硬件定时器单位微秒。
1061    由于OS内部软件定时器采用Tick作为计时单位,硬件定时器采用Cycle作为计时单位,
1062
1063#### 3.1.12 内存基本功能
1064##### 3.1.12.1 向已创建的指定分区申请内存
1065    【接口原型】
1066    void *PRT_MemAlloc(U32 mid, U8 ptNo, uintptr_t size)
1067    【功能描述】
1068    <li>在分区号为ptNo的分区中,申请大小为size的内存。</li>
1069    【返回值】
1070    #NULL  0,申请失败。
1071    #!NULL 内存首地址值。
1072    【参数说明】
1073    mid  [IN]  类型#U32,申请的模块号。
1074    ptNo [IN]  类型#U8,分区号,范围[0,#OS_MEM_MAX_PT_NUM+2),当前未使用,选择默认分区。
1075    size [IN]  类型#uintptr_t,申请的大小。
1076    【注意事项】
1077    申请内存时的分区号,根据实际创建的分区号来使用。
1078    调用函数后,注意判断返回的地址是否为空以避免后续访问空指针。
1079    对于FSC内存算法,申请到的内存首地址是按4字节对齐的
1080    如果内存申请失败,返回值为NULL,而导致失败的原因将记录在错误处理空间中。
1081
1082##### 3.1.12.2 释放申请的内存
1083    【接口原型】
1084    U32 PRT_MemFree(U32 mid, void *addr)
1085    【功能描述】
1086    该接口根据内存块的地址addr,找到该内存块所属的内存分区,再根据分区号和用户使用的地址addr释放该内存。
1087    【返回值】
1088    #OS_OK  0x00000000,内存释放成功。
1089    #其它值,释放失败。
1090    【参数说明】
1091    mid  [IN]  类型#U32,要释放的模块号。
1092    addr [IN]  类型#void *,释放的地址。
1093    【注意事项】
1094    如果返回值不是#OS_OK,则内存不会被释放。
1095    被破坏的内存不能被释放。
1096    对于入参addr,OS已做基本校验,无法校验所有非法地址,其合法性由业务保证。
1097
1098#### 3.1.13 CPU占用率模块
1099##### 3.1.13.1 获取当前cpu占用率
1100    【接口原型】
1101    U32 PRT_CpupNow(void)
1102    【功能描述】
1103    通过本接口获取当前cpu占用率。
1104    【返回值】
1105    #0xffffffff      获取失败,CPUP裁剪开关未打开,或未初始化,或者在osStart之前调用。
1106    #[0,10000]       返回当前cpu占用率。
1107    【参数说明】
1108    无。
1109    【注意事项】
1110    该接口必须在CPUP模块裁剪开关打开,并在osStart之后才能调用此接口,否则返回0xffffffff。
1111    精度为万分之一。
1112    为了减小CPUP统计对线程调度的性能影响,OS采用了基于IDLE计数的统计算法,
1113
1114##### 3.1.13.2 获取指定个数的线程的CPU占用率
1115    【接口原型】
1116    U32 PRT_CpupThread(U32 inNum, struct CpupThread *cpup, U32 *outNum)
1117    【功能描述】
1118    根据用户输入的线程个数,获取指定个数的线程CPU占用率。
1119    【返回值】
1120    #OS_OK  0x00000000,获取成功。
1121    #其它值,获取失败。
1122    【参数说明】
1123    inNum  [IN]  类型#U32,输入的线程个数。
1124    cpup   [OUT] 类型#struct CpupThread *,缓冲区,输出参数,用于填写输出个数线程的CPUP信息。
1125    outNum [OUT] 类型#U32 *,保存输出的实际线程个数指针。
1126    【注意事项】
1127    当且仅当CPUP模式配置为线程级时,该接口有效。
1128    当配置项中的采样周期值等于0时,线程级CPUP采样周期为两次调用该接口或者PRT_CpupNow之间
1129    输出的实际线程个数不大于系统中实际的线程个数(任务个数和一个中断线程)。
1130    若输入的线程个数为1,则仅输出中断线程(除任务线程以外的线程统称)的CPUP信息。
1131    若在一个采样周期内有任务被删除,则统计的任务线程和中断线程CPUP总和小于10000。
1132
1133##### 3.1.13.3 设置CPU占用率告警阈值
1134    【接口原型】
1135    U32 PRT_CpupSetWarnValue(U32 warn, U32 resume)
1136    【功能描述】
1137    根据用户配置的CPU占用率告警阈值warn和告警恢复阈值resume,设置告警和恢复阈值。
1138    【返回值】
1139    #OS_OK  0x00000000,阈值设定成功。
1140    #其它值,阈值设定失败。
1141    【参数说明】
1142    warn   [IN]  类型#U32,CPUP告警阈值。
1143    resume [IN]  类型#U32,CPUP恢复阈值。
1144    【注意事项】
1145    OsStart之前不能调用此接口。
1146
1147##### 3.1.13.4 查询CPUP告警阈值和告警恢复阈值
1148    【接口原型】
1149    U32 PRT_CpupGetWarnValue(U32 *warn, U32 *resume)
1150    【功能描述】
1151    根据用户配置的告警阈值指针warn和告警恢复阈值指针resume,查询告警阈值和告警恢复阈值
1152    【返回值】
1153    #OS_OK  0x00000000,获取成功。
1154    #其它值,获取失败。
1155    【参数说明】
1156    warn   [OUT] 类型#U32 *,CPUP告警阈值。
1157    resume [OUT] 类型#U32 *,CPUP恢复阈值。
1158    【注意事项】
1159    OsStart之前不能调用此接口。
1160
1161##### 3.1.13.5 注册CPUP告警回调函数
1162    【接口原型】
1163    U32 PRT_CpupRegWarnHook(CpupHookFunc hook)
1164    【功能描述】
1165    根据用户配置的回调函数hook,注册CPUP告警回调函数
1166    【返回值】
1167    #OS_OK  0x00000000,注册成功。
1168    #其它值,注册失败。
1169    【参数说明】
1170    hook [IN]  类型#CpupHookFunc,CPU告警回调函数。
1171    【注意事项】
1172    不允许重复或覆盖注册钩子。
1173    hook为NULL时,表示删除该钩子。
1174
1175#### 3.1.14 错误处理
1176##### 3.1.14.1 处理错误
1177    【接口原型】
1178    U32 PRT_ErrHandle(const char *fileName, U32 lineNo, U32 errorNo, U32 paraLen, void *para)
1179    【功能描述】
1180    用户或者OS内部使用该函数回调#PRT_ErrRegHook中注册的钩子函数。另外,OS内部使用此接口时,还会记录相关错误码。
1181    【返回值】
1182    #OS_OK  0x00000000,处理错误成功。
1183    【参数说明】
1184    fileName [IN]  类型#const char *,错误发生的文件名,可以用__FILE__作为输入。
1185    lineNo   [IN]  类型#U32,错误发生所在的行号,可以用__LINE__作为输入。
1186    errorNo  [IN]  类型#U32,用户输入的错误码。
1187    paraLen  [IN]  类型#U32,入参para的长度。
1188    para     [OUT] 类型#void *,记录用户对于错误的描述或其他(地址)。
1189    【注意事项】
1190    系统不会做入参检测,用户PRT_ErrHandle会全部当做钩子入参输入。
1191    用户调用PRT_ErrHandle接口时,只会回调用户注册钩子函数,不会进行错误码记录
1192
1193##### 3.1.14.2 注册用户错误处理的钩子函数
1194    【接口原型】
1195    U32 PRT_ErrRegHook(ErrHandleFunc hook)
1196    【功能描述】
1197    注册hook作为用户钩子函数,在调用PRT_ErrHandle接口进行错误处理时对该钩子进行调用。
1198    【返回值】
1199    #OS_OK  0x00000000,注册成功。
1200    #其它值,注册失败。
1201    【参数说明】
1202    hook [IN]  类型#ErrHandleFunc,用户钩子函数的宏定义。
1203    【注意事项】
1204    若入参hook为NULL,则为取消钩子。
1205    不允许重复或覆盖注册。
1206    用户定义的钩子函数必须符合#PRT_ERRORHANDLE_FUNC定义的形式,而且只能定义一个钩子函数。
1207    用户调用PRT_ErrRegHook注册回调钩子函数时,钩子函数里面不能有调用PRT_ErrHandle
1208    用户调用PRT_ErrRegHook注册回调钩子函数时,钩子函数里面如有单次上报的错误信息(只有第一次调用会执行)
1209
1210### 3.2 config接口
1211    【接口原型】
1212    OS_SYS_CLOCK
1213    【功能描述】
1214    芯片主频
1215    【接口原型】
1216    OS_HWI_MAX_NUM_CONFIG
1217    【功能描述】
1218    硬中断最大支持个数
1219    【接口原型】
1220    OS_INCLUDE_TICK
1221    【功能描述】
1222    Tick中断模块裁剪开关
1223    【接口原型】
1224    OS_TICK_PER_SECOND
1225    【功能描述】
1226    Tick中断时间间隔,tick处理时间不能超过1/OS_TICK_PER_SECOND(s)
1227    【接口原型】
1228    OS_INCLUDE_TICK_SWTMER
1229    【功能描述】
1230    基于TICK的软件定时器裁剪开关
1231    【接口原型】
1232    OS_TICK_SWITIMER_MAX_NUM
1233    【功能描述】
1234    基于TICK的软件定时器最大个数
1235    【接口原型】
1236    OS_INCLUDE_TASK
1237    【功能描述】
1238    任务模块裁剪开关
1239    【接口原型】
1240    OS_TSK_MAX_SUPPORT_NUM
1241    【功能描述】
1242    最大支持的任务数,最大共支持254个
1243    【接口原型】
1244    OS_TSK_DEFAULT_STACK_SIZE
1245    【功能描述】
1246    缺省的任务栈大小
1247    【接口原型】
1248    OS_TSK_IDLE_STACK_SIZE
1249    【功能描述】
1250    IDLE任务栈的大小
1251    【接口原型】
1252    OS_TSK_STACK_MAGIC_WORD
1253    【功能描述】
1254    任务栈初始化魔术字,默认是0xCA,只支持配置一个字节
1255    【接口原型】
1256    OS_INCLUDE_CPUP
1257    【功能描述】
1258    CPU占用率模块裁剪开关
1259    【接口原型】
1260    OS_CPUP_SAMPLE_INTERVAL
1261    【功能描述】
1262    采样时间间隔(单位tick),若其值大于0,则作为采样周期,否则两次调用PRT_CpupNow或PRT_CpupThread间隔作为周期
1263    【接口原型】
1264    OS_CONFIG_CPUP_WARN
1265    【功能描述】
1266    CPU占用率告警动态配置项
1267    【接口原型】
1268    OS_CPUP_SHORT_WARN
1269    【功能描述】
1270    CPU占用率告警阈值(精度为万分比)
1271    【接口原型】
1272    OS_CPUP_SHORT_RESUME
1273    【功能描述】
1274    CPU占用率告警恢复阈值(精度为万分比)
1275    【接口原型】
1276    OS_MEM_MAX_PT_NUM
1277    【功能描述】
1278    用户可以创建的最大分区数,取值范围[0,253]
1279    【接口原型】
1280    OS_MEM_FSC_PT_ADDR
1281    【功能描述】
1282    私有FSC内存分区起始地址
1283    【接口原型】
1284    OS_MEM_FSC_PT_SIZE
1285    【功能描述】
1286    私有FSC内存分区大小
1287    【接口原型】
1288    OS_INCLUDE_SEM
1289    【功能描述】
1290    信号量模块裁剪开关
1291    【接口原型】
1292    OS_SEM_MAX_SUPPORT_NUM
1293    【功能描述】
1294    最大支持的信号量数
1295    【接口原型】
1296    OS_INCLUDE_QUEUE
1297    【功能描述】
1298    队列模块裁剪开关
1299    【接口原型】
1300    OS_QUEUE_MAX_SUPPORT_NUM
1301    【功能描述】
1302    最大支持的队列数,范围(0,0xFFFF]
1303    【接口原型】
1304    OS_HOOK_HWI_ENTRY_NUM
1305    【功能描述】
1306    硬中断进入钩子最大支持个数, 范围[0, 255]
1307    【接口原型】
1308    OS_HOOK_HWI_EXIT_NUM
1309    【功能描述】
1310    硬中断退出钩子最大支持个数, 范围[0, 255]
1311    【接口原型】
1312    OS_HOOK_TSK_SWITCH_NUM
1313    【功能描述】
1314    任务切换钩子最大支持个数, 范围[0, 255]
1315    【接口原型】
1316    OS_HOOK_IDLE_NUM
1317    【功能描述】
1318    IDLE钩子最大支持个数, 范围[0, 255]
1319