问题背景
SylixOS从2006年韩总在大学时开始开发,到今年2024年已走过18个年头,这18年一直在不断迭代更新,也经过无数实际项目的考验,SylixOS无论从功能还是性能上看,都毫无疑问是世界一流的大型实时操作系统。
但实时操作系统或嵌入式操作系统数量庞大,且没有任何一个能在市场上有垄断地位,锁片化定制化严重,所以也没有一个能像Linux、Windows那样具备深厚海量的技术生态,比如在技术文档上就多有欠缺。SylixOS也同样存在类似问题,官方文档还不能把所有细节的功能、特性、用法都一一写明。
如果我们在学习使用SylixOS某API查不到官方资料也找不到网络资料时该如何解决呢?一个简单有效的方法就是总系统源码里或者说base工程里找。因为内核里不仅有实现该接口的源码,操作系统本身也会大量使用系统接口。我们参考源码实现和调用举例就能分析出该接口的功能和用法。
操作步骤
以API_InterLock为例,在《SylixOS驱动开发手册》和《SylixOS应用开发手册》都找不到相关说明。网络搜索也没有有用信息,就更不要去问AI了。这时,我们可以在IDE下搜索API_InterLock来进行了解学习。
- IDE下点击小手电图标,进入全局搜索页面。
注意:编辑页面下ctrl+f进入的是页面搜索界面。
2. 选择C/C++Search标签页,填写API_InterLock到搜索框中,然后点击Search按钮查看搜索结果。
- C/C++Search标签页搜索的是C/C++语言的各种表示符、关键字等。API_InterLock是一个函数或宏定义,所以要用C/C++Search来搜索。
- File Search标签页是按文本内容来搜索,并不考虑C/C++语言相关特性,所以C/C++Search搜索的内容也能在这里搜索,但范围会扩大,非.c.h文件内,及注释内,字符串内的都会被搜索。所以如果是想搜索命令行打印的一些信息,就应该选择File Search标签页。
-
查看搜索结果。
可以看到共搜索到两处,一处定义一处声明,并没有调用的地方。
查看源码实现可知,API_InterLock是借助宏KN_INT_DISABLE实现的,只是增加了参数检查。返回piregInterLevel的方式也不同罢了。API_InterLock功能就是关闭全局中断并返回嵌套层级。
还不是很清楚的话,我们可以继续搜索KN_INT_DISABLE。 -
继续搜索KN_INT_DISABLE,并查看结果。
这次可以看到有大量的调用实例。观察可知,开关全局中断是要成对调用的,且要借助一个局部变量来记录嵌套层数。此时我们知道可以用KN_INT_DISABLE来替代API_InterLock来使用,如果确实要用API_InterLock那也可以参考KN_INT_DISABLE的调用套路来写。
同样实现_CpuGetNesting函数,使用API_InterLock接口如下:
ULONG _CpuGetNesting (VOID)
{
#if LW_CFG_SMP_EN > 0INTREG iregInterLevel;ULONG ulNesting;API_InterLock(&iregInterLevel); /* 关闭中断 */ulNesting = LW_CPU_GET_CUR()->CPU_ulInterNesting;API_InterUnlock(iregInterLevel); /* 打开中断 */return (ulNesting);
#elsereturn (LW_CPU_GET_CUR()->CPU_ulInterNesting);
#endif /* LW_CFG_SMP_EN > 0 */
}