3.2 内核模式下各种开头函数的区别

本文详细解析了驱动开发中常见的内核模式函数开头及其含义,包括Cc、Cm、Ex、FsRtl、Hal、Io、Ke、Lpc、Lsa、Mm、Nt、Ob、Po、Ps、Rtl、Se、Wmi和Zw等,为开发者提供深入理解的基础。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

3.2 内核模式下各种开头函数的区别
在驱动开发的过程中,我们可能遇到很多不同开头的函数,如前面我们遇到过的Rtl和Io系列,此外还有比如Ex、Ps、Nt等等。
常见的函数开头及其含义如下表所示。
函数开头
含义
Cc
Cachemanager
Windows 下设备驱动程序的开发方法 2120080411 计算机应用 赖锡盛
9
Cm
Configurationmanager
Ex
Executive support rountines
FsRtl
File system driver run-time library
Hal
Hardware abstraction layer
Io
I/O manager
Ke
Kernel
Lpc
Local Procedure Call
Lsa
Local security authentication
Mm
Memory manager
Nt
Windows2000 system services(most of which are exported as win32 functions),例如NtCreateFile往往导出为CreateFile
Ob
Object manager
Po
Power manger
Pp
PnP manager
Ps
Process support
Rtl
Run-time library
Se
Security
Wmi
Windows Management Instrumentation
Zw
Mirror entry point for system services(beginning with Nt)that sets previous access mode to kernel, which eliminates parameter validation, since Ntsystem services validate parameters only if previous access mode is user see Inside Microsoft Windows2000
上表中所提及到的并不完整,还有一些Dbg、Fs、Csr、Etw等开头的都没有提及到,这些可以等需要用到的时候再进行说明。
#include <stdio.h> #include "ry72xx_system.h" #include "ry_gpio_drv.h" #include "uart0_hal_drv.h" #include "ry_rtc_drv.h" #include "ry_delay_drv.h" #include "ry_systick_drv.h" #include "systick_config.h" /** **************************************************************************************** * @addtogroup demo_if_systick * @copydoc systick_main.c * * @brief 内核模块系统节拍定时器测试例程主程序 * @details 主要包含内核模块系统节拍定时器功能测试,main函数入口 * * @section 操作步骤: * -# 选择系统时钟并初始化。 * -# 初始化串口和GPIO口并所有LED闪烁输出,配置系统节拍定时器的节拍时长和系统节拍定时器中断回调函数,在回调函数中翻转LED1灯,同时全局变量节拍个数增加1。 * -# 然后等待LB按键按下,第一次LB被按下后开启系统节拍定时并打印输出状态信息。 * -# 第二次LB被按下后关闭系统节拍定时并打印输出第一次与第二次之间的时长信息。 * -# 第三次LB被按下则重新开启系统节拍定时,第四次按下则关闭系统节拍定时,以此类推。 * * @section 实验现象: * -# 打印测试开始信息,然后所有LED闪烁。 * -# 奇数次按下LB按键(LED6翻转),串口打印输出系统节拍定时开启的状态信息。 * -# 偶数次按下LB按键(LED6翻转),串口打印输出系统节拍定时关闭的状态信息。 * * @{ * **************************************************************************************** */ #define SYSTICK_TRIG_TIME 100000 /** 系统节拍时长,单位:微秒(Us) */ uint32 sys_load_val = 0x0; /* 系统节拍定时器加载值 */ uint32 sys_run_time = 0x0; /* 系统运行时长————运行期间的节拍个数 */ void systick_int_callback(void) { sys_run_time++; gpio_out_toggle(LED1_PA20); } /** * \brief 主程序 */ int main(void) { uint8 i; /* 模块电源配置 */ pmu_peri_clear_all(); pmu_power_adc_config(POWER_ADC_INTERNAL_VDD); pmu_power_usb_config(POWER_USB_INTERNAL_OFF); pmu_power_gpioc_config(POWER_GPIOC_INTERNAL_VDD); pmu_power_gpiod_config(POWER_GPIOD_INTERNAL_VDD); system_clk_init(IMO_CLK_48MHz, HFCLK_DIV1); /* 初始化时钟 */ ry_delay_ms(3000); /* 串口初始化的宏定义在编译器Options的Preprocessor Symbols中 */ #ifdef PRINT_UART0 uart0_hal_init(); #elif PRINT_UART1 uart1_hal_init(); #endif PRINT("systick test is start!!!\r\n"); /* LED灯初始化配置 */ gpio_cfg_output(LED1_PA20, RY_GPIO_DRIVE_S0_S1); gpio_out_clear(LED1_PA20); gpio_cfg_output(LED2_PA21, RY_GPIO_DRIVE_S0_S1); gpio_out_clear(LED2_PA21); gpio_cfg_output(LED3_PA22, RY_GPIO_DRIVE_S0_S1); gpio_out_clear(LED3_PA22); gpio_cfg_output(LED4_PA23, RY_GPIO_DRIVE_S0_S1); gpio_out_clear(LED4_PA23); gpio_cfg_output(LED5_PA24, RY_GPIO_DRIVE_S0_S1); gpio_out_clear(LED5_PA24); gpio_cfg_output(LED6_PA25, RY_GPIO_DRIVE_S0_S1); gpio_out_clear(LED6_PA25); /* 三色LED灯的颜色初始化配置 */ gpio_out_set(B_C0_PA6); gpio_cfg_output(B_C0_PA6, RY_GPIO_DRIVE_S0_S1); gpio_out_set(G_C0_PA7); gpio_cfg_output(G_C0_PA7, RY_GPIO_DRIVE_S0_S1); gpio_out_set(R_C0_PA8); gpio_cfg_output(R_C0_PA8, RY_GPIO_DRIVE_S0_S1); gpio_out_clear(R_C0_PA8); /* 使能三色LED灯的红色灯 */ for(i = 0; i < 30; i++) /* 所有LED闪烁 */ { gpio_out_multi_toggle(PA_GROUP, LED1_PA20_MASK|LED2_PA21_MASK|LED3_PA22_MASK|LED4_PA23_MASK|LED5_PA24_MASK|LED6_PA25_MASK); ry_delay_ms(100); } gpio_cfg_input(LB_BTN1_PA13, RY_GPIO_PULLUP_5K); if(systick_set_load(SYSTICK_TRIG_TIME)) /* 设置系统节拍 */ { PRINT("systick load val error, please comfirm it!\r\n"); } systick_int_init(systick_int_callback); /* 配置中断回调函数 */ while(1) { ry_delay_ms(1); if(gpio_in_read(LB_BTN1_PA13) == 0x0) { while(gpio_in_read(LB_BTN1_PA13) == 0x0); gpio_out_toggle(LED6_PA25); ry_delay_ms(1); if(gpio_in_read(LED6_PA25)) { PRINT("systick start times:%dUs\r\n", sys_run_time*SYSTICK_TRIG_TIME); systick_enable(); /* 开启系统节拍定时器 */ } else { systick_disable(); /* 关闭系统节拍定时器 */ PRINT("systick stop times:%dUs\r\n", sys_run_time*SYSTICK_TRIG_TIME); systick_set_count(0); /* 重置定时器计数值 */ sys_run_time = 0; } } } }梳理一下这段代码,并整理一下思维逻辑与固定开发套路
03-21
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值