📄 cpu.c
字号:
//----------------------------------------------------
//Copyright (C), 2004-2009, lst.
//版权所有 (C), 2004-2009, lst.
//所属模块:调度器
//作者:lst
//版本:V1.0.0
//文件描述:调度器中与CPU直接相关的代码。
//其他说明:
//修订历史:
// 2. ...
// 1. 日期:
// 作者:
// 新版本号:
// 修改说明:
//------------------------------------------------------
#include "inc_os.h"
extern void (*user_swi)(uint32_t api_no); //在脚本中定义
//----创建线程-----------------------------------------------------------------
//功能:为事件类型创建伪虚拟机,初始化上下文环境,安装执行函数,构成完整线程
//参数:evtt_id,待创建的线程所服务的事件类型id
//返回:新创建的线程的虚拟机指针
//注: 移植关键函数
//-----------------------------------------------------------------------------
struct thread_vm *__create_thread(struct event_type *evtt_id)
{
struct thread_vm *result;
ptu32_t len;
//计算虚拟机栈:线程+最大单个api需求的栈
len = evtt_id->stack_size+cn_kernel_stack+sizeof(struct thread_vm);
//栈顶需要对齐,malloc函数能保证栈底是对齐的,对齐长度可以使栈顶对齐
len = align_up(len);
result=(struct thread_vm *)m_malloc_gbl(len,0); //申请内存,移植关键
if(result==NULL)
{
y_error_login(enum_mem_tried,NULL); //内存不足,返回错误
return result;
}
//看实际分配了多少内存,djyos内存分配使用块相联策略,如果分配的内存量大于
//申请量,可以保证其实际尺寸是对齐的。之所以注释掉,是因为当len大于申请量时,
//对齐只是实际结果,而不是内存管理的规定动作,如果不注释掉,就要求内存管理
//模块必须提供对齐的结果,对模块独立性是不利的。
// len = m_check_size(result);
result->stack_top = (uint32_t*)((ptu32_t)result+len); //栈顶地址,移植关键
result->next = NULL;
result->func = evtt_id->thread_routine; //db
result->stack_size = len - sizeof(struct thread_vm); //保存栈深度
result->host_vm = NULL;
//复位虚拟机并重置线程
__asm_reset_thread(evtt_id->thread_routine,result);
return result;
}
//----初始化api----------------------------------------------------------------
//功能:安装swi向量表
//参数:event,待恢复的事件.
//返回:无
//备注: 本函数只有mp模式要使用,以后再说。
//-----------------------------------------------------------------------------
void y_init_api(uint32_t api_no)
{
user_swi = y_api_start;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -