MS-RTOS 内核接口
本章将介绍 MS-RTOS 内核接口的使用。
内核相关 API
下表展示了内核相关的 API 在两个权限空间下是否可用:
API | 用户空间 | 内核空间 |
---|---|---|
ms_rtos_version | ● | ● |
ms_rtos_name | ● | ● |
ms_rtos_license | ● | ● |
ms_rtos_logo | ● | ● |
ms_rtos_reboot | ● | ● |
ms_rtos_shutdown | ● | ● |
ms_rtos_update | ● | ● |
ms_rtos_init | ● | |
ms_rtos_start | ● | |
ms_printk | ● | |
ms_printk_set_level | ● | |
ms_sched_lock | ● | |
ms_sched_unlock | ● | |
ms_schedule | ● | |
ms_kern_tick | ● | |
ms_access_ok | ● | |
ms_op_perm_ok | ● | |
ms_dev_perm_ok | ● | |
ms_dir_perm_ok | ● | |
ms_eeprom_write_ok | ● | |
ms_arch_int_disable | ● | |
ms_arch_int_resume | ● | |
ms_arch_ffs | ● | |
ms_arch_memcpy | ● | |
ms_write32 | ● | |
ms_read32 | ● | |
ms_write16 | ● | |
ms_read16 | ● | |
ms_write8 | ● | |
ms_read8 | ● | |
ms_idle_hook_add | ● | |
ms_idle_hook_remove | ● |
ms_rtos_version()
描述 获得 MS-RTOS 版本号
函数原型
ms_uint32_t ms_rtos_version(void);
参数 无
返回值 MS-RTOS 版本号
注意事项 无
示例
int main(int argc, char *argv[])
{
ms_uint32_t version = ms_rtos_version();
// do some thing
return 0;
}
ms_rtos_name()
描述 获得 MS-RTOS 名字字符串
函数原型
const char *ms_rtos_name(void);
参数 无
返回值 MS-RTOS 名字字符串
注意事项 无
示例
int main(int argc, char *argv[])
{
const char *name = ms_rtos_name();
// do some thing
return 0;
}
ms_rtos_license()
描述 获得 MS-RTOS license 字符串
函数原型
const char *ms_rtos_license(void);
参数 无
返回值 MS-RTOS license 字符串
注意事项 无
示例
int main(int argc, char *argv[])
{
const char *license = ms_rtos_license();
// do some thing
return 0;
}
ms_rtos_logo()
描述 获得 MS-RTOS logo 字符串
函数原型
const char *ms_rtos_logo(void);
参数 无
返回值 MS-RTOS logo 字符串
注意事项 无
示例
int main(int argc, char *argv[])
{
const char *logo = ms_rtos_logo();
// do some thing
return 0;
}
ms_rtos_reboot()
描述 重启机器
函数原型
ms_err_t ms_rtos_reboot(void);
参数 无
返回值 MS-RTOS 内核错误码
注意事项 无
示例
int main(int argc, char *argv[])
{
ms_rtos_reboot();
return 0;
}
ms_rtos_shutdown()
描述 关机
函数原型
ms_err_t ms_rtos_shutdown(void);
参数 无
返回值 MS-RTOS 内核错误码
注意事项 无
示例
int main(int argc, char *argv[])
{
ms_rtos_shutdown();
return 0;
}
ms_rtos_update()
描述 更新 MS-RTOS OS 和 APP 镜像
函数原型
ms_err_t ms_rtos_update(void);
参数 无
返回值 MS-RTOS 内核错误码
注意事项 无
示例
int main(int argc, char *argv[])
{
ms_rtos_update();
return 0;
}
ms_rtos_init()
描述 初始化 MS-RTOS 内核和各种子系统
函数原型
ms_err_t ms_rtos_init(ms_mem_layout_t *mem_layout);
- 参数
输入/输出 | 参数 | 描述 |
---|---|---|
[in] | mem_layout | 内存布局类型指针 |
内存布局类型每一个成员代表哪一个内存区域已经被固定好:
宏 | 值 | 描述 |
---|---|---|
MS_FLASH_REGION | 0U | FLASH 区域,进程可读、可执行,必须有效 |
MS_EXT_FLASH_REGION | 1U | 扩展的 FLASH 区域,进程可读、可执行,可以没有 |
MS_KERN_TEXT_REGION | 2U | 内核代码区域,进程不能访问,必须有效 |
MS_KERN_DATA_REGION | 3U | 内核数据区域,进程不能访问,必须有效 |
MS_KERN_HEAP_REGION | 4U | 内核内存堆区域,在内核数据区域里面,必须有效 |
MS_SHARED_RAM_REGION | 5U | 共享内存区域,进程可读、可写、可执行,地址和大小可以为 0(即无效) |
MS_PROCESS_MEM_REGION | 6U | 进程内存区域,进程可读、可写,支持进程特性的 MS-RTOS 必须有效 |
MS_DEV_SPACE_REGION | 7U | 设备虚拟地址空间区域(带有 MMU 的系统才需要) |
MS_USER_SPACE_REGION | 8U | 用户虚拟地址空间区域(带有 MMU 的系统才需要) |
返回值 MS-RTOS 内核错误码
注意事项 不能在中断中调用,不能在 MS-RTOS 启动后调用,不能重复调用,一般在 CPU 复位后初始化基本硬件设施后马上调用
示例 请参考系统移植章节
ms_rtos_start()
描述 启动 MS-RTOS
函数原型
ms_err_t ms_rtos_start(void);
参数 无
返回值 MS-RTOS 内核错误码
注意事项 不能在中断中调用,在 MS-RTOS 初始化后调用,不能重复调用
示例 请参考系统移植章节
ms_printk()
描述 内核打印信息,信息通过
ms_bsp_printk
接口进行输出函数原型
void ms_printk(ms_pk_level_t level, const char *fmt, ...) MS_PRINTK_ATTR;
- 参数
输入/输出 | 参数 | 描述 |
---|---|---|
[in] | level | 日志级别 |
[in] | fmt | 格式化字符串 |
日志级别为以下的宏:
宏 | 值 | 描述 |
---|---|---|
MS_PK_EMERG | 0U | 紧急事件消息,系统崩溃之前提示,表示系统不可用 |
MS_PK_ALERT | 1U | 报告消息,表示必须立即采取措施 |
MS_PK_CRIT | 2U | 临界条件,通常涉及严重的硬件或软件操作失败 |
MS_PK_ERR | 3U | 错误条件,驱动程序常用 MS_PK_ERR 来报告硬件的错误 |
MS_PK_WARNING | 4U | 警告条件,对可能出现问题的情况进行警告 |
MS_PK_NOTICE | 5U | 正常但又重要的条件,用于提醒 |
MS_PK_INFO | 6U | 提示信息,如驱动程序启动时,打印硬件信息 |
MS_PK_DEBUG | 7U | 调试级别的消息 |
返回值 无
注意事项 无
示例
void xxx(void)
{
ms_printk(MS_PK_DEBUG, "xxx %d\n", 1);
// do some thing
}
ms_printk_set_level()
描述 设置
ms_printk
函数可打印的日志级别(默认为MS_PK_DEBUG
)函数原型
ms_err_t ms_printk_set_level(ms_pk_level_t level);
- 参数
输入/输出 | 参数 | 描述 |
---|---|---|
[in] | level | 可打印的日志级别 |
返回值 MS-RTOS 内核错误码
注意事项 无
示例
void xxx(void)
{
ms_printk_set_level(MS_PK_NOTICE);
// do some thing
}
ms_sched_lock()
描述 锁住内核调度器
函数原型
ms_err_t ms_sched_lock(void);
参数 无
返回值 MS-RTOS 内核错误码
注意事项 不能在中断中调用,不能在内核启动前调用,与
ms_sched_unlock
配对使用示例 见
ms_sched_unlock()
ms_sched_unlock()
描述 解锁内核调度器
函数原型
ms_err_t ms_sched_unlock(void);
参数 无
返回值 MS-RTOS 内核错误码
注意事项 不能在中断中调用,不能在内核启动前调用,与
ms_sched_lock
配对使用示例
void xxx(void)
{
ms_sched_lock();
// do some thing
ms_sched_unlock();
}
ms_schedule()
描述 进行一次线程调度
函数原型
void ms_schedule(void);
参数 无
返回值 无
注意事项 中断中、内核启动前、内核锁定期间调用并不会进行线程调度
示例
void xxx(void)
{
ms_schedule();
}
ms_kern_tick()
描述 维护内核心跳时间
函数原型
ms_err_t ms_kern_tick(ms_tick_t n_tick);
- 参数
输入/输出 | 参数 | 描述 |
---|---|---|
[in] | n_tick | 经过了多少个嘀嗒 |
返回值 MS-RTOS 内核错误码
注意事项 只能由硬件定时器中断服务函数或中断入口函数调用
示例
如果使能了 ISR 管理 MS_CFG_KERN_ISR_MANAGE_EN
,在硬件定时器中断服务函数中调用:
static ms_irq_ret_t timer_isr(ms_ptr arg)
{
// do some thing
ms_kern_tick(1U);
return MS_IRQ_HANDLED;
}
如果没有使能 ISR 管理 MS_CFG_KERN_ISR_MANAGE_EN
,在硬件定时器中断入口函数中调用:
void timer_int_handle(void)
{
// enter interrupt
ms_int_enter();
// do some thing
ms_kern_tick(1U);
// exit interrupt
ms_int_exit();
}
ms_access_ok()
描述 判断当前线程指定的内存范围是否能够以指定的访问模式来访问
函数原型
ms_bool_t ms_access_ok(ms_const_ptr_t addr, ms_size_t size, ms_access_mode_t mode);
- 参数
输入/输出 | 参数 | 描述 |
---|---|---|
[in] | addr | 内存基地址 |
[in] | size | 内存大小 |
[in] | mode | 访问模式 |
访问模式为以下的宏:
宏 | 含义 |
---|---|
MS_ACCESS_R | 只读 |
MS_ACCESS_W | 只写 |
MS_ACCESS_RW | 读写 |
返回值 MS_TRUE:可以访问,MS_FALSE:不能访问
注意事项 无
示例
void xxx(void)
{
ms_bool_t ret = ms_access_ok(0xc0000000, 4, MS_ACCESS_R);
// do some thing
}
ms_op_perm_ok()
描述 判断当前线程是否有指定的操作权限
函数原型
ms_bool_t ms_op_perm_ok(ms_op_perm_t op_perm);
- 参数
输入/输出 | 参数 | 描述 |
---|---|---|
[in] | op_perm | 操作权限 |
操作权限为以下的宏:
宏 | 含义 |
---|---|
MS_OP_PERM_REBOOT | 重启、关机 |
MS_OP_PERM_UPDATE | 升级 |
MS_OP_PERM_TIME_SET | 设置时间 |
MS_OP_PERM_APP_START | 启动 APP |
MS_OP_PERM_APP_KILL | 杀死 APP |
MS_OP_PERM_APP_SIGNAL | 给 APP 发信号 |
返回值 MS_TRUE:有权限,MS_FALSE:没权限
注意事项 无
示例
void xxx(void)
{
ms_bool_t ret = ms_op_perm_ok(MS_OP_PERM_TIME_SET);
// do some thing
}
ms_dev_perm_ok()
描述 判断当前线程是否有指定设备的指定读写权限
函数原型
ms_bool_t ms_dev_perm_ok(const char *path, ms_dev_perm_t perm);
- 参数
输入/输出 | 参数 | 描述 |
---|---|---|
[in] | path | 设备路径 |
[in] | perm | 设备读写权限 |
设备读写权限为以下的宏:
宏 | 含义 |
---|---|
MS_DEV_PERM_R | 读设备 |
MS_DEV_PERM_W | 写设备 |
MS_DEV_PERM_RW | 读写设备 |
返回值 MS_TRUE:有权限,MS_FALSE:没权限
注意事项 无
示例
void xxx(void)
{
ms_bool_t ret = ms_dev_perm_ok("/dev/xxx", MS_DEV_PERM_W);
// do some thing
}
ms_dir_perm_ok()
描述 判断当前线程是否有指定目录的访问权限
函数原型
ms_bool_t ms_dir_perm_ok(const char *path);
- 参数
输入/输出 | 参数 | 描述 |
---|---|---|
[in] | path | 目录路径 |
返回值 MS_TRUE:有权限,MS_FALSE:没权限
注意事项 无
示例
void xxx(void)
{
ms_bool_t ret = ms_dir_perm_ok("/nor/update");
// do some thing
}
ms_eeprom_write_ok()
描述 判断当前线程是否有指定的 EEPROM 空间的写权限
函数原型
ms_bool_t ms_eeprom_write_ok(ms_uint32_t addr, ms_size_t len);
- 参数
输入/输出 | 参数 | 描述 |
---|---|---|
[in] | addr | EEPROM 空间的起始地址 |
[in] | len | EEPROM 空间的长度 |
返回值 MS_TRUE:有权限,MS_FALSE:没权限
注意事项 无
示例
void xxx(void)
{
ms_bool_t ret = ms_eeprom_write_ok(0, 10);
// do some thing
}
ms_arch_int_disable()
描述 屏蔽 CPU 中断
函数原型
ms_arch_sr_t ms_arch_int_disable(void);
参数 无
返回值 屏蔽前的 CPU 中断使能状态
注意事项 无
示例 见
ms_arch_int_resume
ms_arch_int_resume()
描述 恢复 CPU 中断使能状态
函数原型
void ms_arch_int_resume(ms_arch_sr_t sr);
- 参数
输入/输出 | 参数 | 描述 |
---|---|---|
[in] | sr | CPU 中断使能状态(由 ms_arch_int_disable 返回) |
返回值 无
注意事项 无
示例
void xxx(void)
{
ms_arch_sr_t sr = ms_arch_int_disable();
// do some thing
ms_arch_int_resume(sr);
}
ms_arch_ffs()
描述 查找无符号 32 位数中第一个置 1 的位
函数原型
ms_uint32_t ms_arch_ffs(ms_uint32_t value);
- 参数
输入/输出 | 参数 | 描述 |
---|---|---|
[in] | value | 需要查找的无符号 32 位数 |
返回值 第一个置 1 的位的编号,正确返回 [1 ~ 32],如果没有位被置 1,返回 0
注意事项 无
示例
void xxx(void)
{
ms_uint32_t bit_no = ms_arch_ffs(0x00010000);
// do some thing
}
ms_arch_memcpy()
描述 内存拷贝
函数原型
void ms_arch_memcpy(ms_ptr_t dest, ms_const_ptr_t src, ms_size_t size);
- 参数
输入/输出 | 参数 | 描述 |
---|---|---|
[in] | dest | 目的内存地址 |
[in] | src | 源内存地址 |
[in] | size | 需要拷贝的长度 |
返回值 无
注意事项 无
示例
void xxx(void)
{
ms_uint8_t buf_src[100];
ms_uint8_t buf_dst[100];
ms_arch_memcpy(buf_dst, buf_src, sizeof(buf_src));
// do some thing
}
ms_write32()
描述 写 32 位数据到指定地址
函数原型
void ms_write32(ms_uint32_t data, ms_addr_t addr)
- 参数
输入/输出 | 参数 | 描述 |
---|---|---|
[in] | data | 数据 |
[in] | addr | 地址 |
返回值 无
注意事项 无
示例
void xxx(void)
{
ms_write32(0x00010000, 0xc0000000);
// do some thing
}
ms_read32()
描述 从指定地址读 32 位数据
函数原型
ms_uint32_t ms_read32(ms_addr_t addr)
- 参数
输入/输出 | 参数 | 描述 |
---|---|---|
[in] | addr | 地址 |
返回值 32 位数据
注意事项 无
示例
void xxx(void)
{
ms_uint32_t val = ms_read32(0xc0000000);
// do some thing
}
ms_write16()
描述 写 16 位数据到指定地址
函数原型
void ms_write16(ms_uint16_t data, ms_addr_t addr)
- 参数
输入/输出 | 参数 | 描述 |
---|---|---|
[in] | data | 数据 |
[in] | addr | 地址 |
返回值 无
注意事项 无
示例
void xxx(void)
{
ms_write16(0x0001, 0xc0000000);
// do some thing
}
ms_read16()
描述 从指定地址读 16 位数据
函数原型
ms_uint16_t ms_read16(ms_addr_t addr)
- 参数
输入/输出 | 参数 | 描述 |
---|---|---|
[in] | addr | 地址 |
返回值 16 位数据
注意事项 无
示例
void xxx(void)
{
ms_uint16_t val = ms_read16(0xc0000000);
// do some thing
}
ms_write8()
描述 写 8 位数据到指定地址
函数原型
void ms_write8(ms_uint8_t data, ms_addr_t addr)
- 参数
输入/输出 | 参数 | 描述 |
---|---|---|
[in] | data | 数据 |
[in] | addr | 地址 |
返回值 无
注意事项 无
示例
void xxx(void)
{
ms_write8(0x01, 0xc0000000);
// do some thing
}
ms_read8()
描述 从指定地址读 8 位数据
函数原型
ms_uint8_t ms_read8(ms_addr_t addr)
- 参数
输入/输出 | 参数 | 描述 |
---|---|---|
[in] | addr | 地址 |
返回值 8 位数据
注意事项 无
示例
void xxx(void)
{
ms_uint8_t val = ms_read8(0xc0000000);
// do some thing
}
ms_idle_hook_add()
描述 添加一个 idle 线程勾子函数
函数原型
ms_err_t ms_idle_hook_add(ms_idle_hook_t *hook);
- 参数
输入/输出 | 参数 | 描述 |
---|---|---|
[in] | hook | idle 线程勾子指针 |
返回值 MS-RTOS 内核错误码
注意事项 无
示例
static ms_idle_hook_t myhook;
static void my_idle_hook(ms_ptr_t arg)
{
// do something
}
void xxx(void)
{
myhook.callback = my_idle_hook;
myhook.arg = MS_NULL;
ms_idle_hook_add(&myhook);
}
ms_idle_hook_remove()
描述 移除一个 idle 线程勾子函数
函数原型
ms_err_t ms_idle_hook_remove(ms_idle_hook_t *hook);
- 参数
输入/输出 | 参数 | 描述 |
---|---|---|
[in] | hook | idle 线程勾子指针 |
返回值 MS-RTOS 内核错误码
注意事项 无
示例
void xxx(void)
{
ms_idle_hook_remove(&myhook);
}