当前位置: 首页 > news >正文

网站建设与网页设计案例教程 重庆大学出版社常州好的网站设计公司

网站建设与网页设计案例教程 重庆大学出版社,常州好的网站设计公司,基于c 的视频网站开发,wordpress 移动端检查创建线程 用户在基于RTOS开发应用程序前#xff0c;首先要创建线程。 用户创建一个线程时须指定用户希望采用的调度策略。 例如#xff0c;用户想创建一个周期性执行的线程#xff1a; acoral_period_policy_data_t* data; data acoral_malloc(sizeof(acoral_period_poli…创建线程 用户在基于RTOS开发应用程序前首先要创建线程。 用户创建一个线程时须指定用户希望采用的调度策略。 例如用户想创建一个周期性执行的线程 acoral_period_policy_data_t* data; data acoral_malloc(sizeof(acoral_period_policy_data_t)); data-prio5; data-prio_typeACORAL_HARD_PRIO; data-time2000;acoral_crate_thread(test,512,NULL,test,NULL,ACORAL_SCHED_POLICY_PERIOD,data);int create_thread(void (*route)(void *args),unsigned int sttack_size,void *args,char *name,void *stack,unsigned int sched_policy,void *data){acoral_thread_t *thread;threadalloc_thrad();if(NULLthread){acoral_print(Alloc thread:%s fail\n,name);acoral_print(No Mem Space or Beyond the max thread\n);return -1;}thread-name name;stack_size stack_size(~3); //将stack_size变量的值取为向下取整的4的倍数thread-stack_size stack_size;if(stack!NULL)thread-stack_buttom (unsigned int *)stack;elsethread-stack_buttomNULL;thread-policy sched_policy;return acoral_policy_thread_init(sched_policy,threadd,route,args,data); }分配线程空间 创建线程需要做的第一项工作就是为该线程分配内存空间线程是通过TCB描述的为该线程分配内存空间就是为TCB分配内存空间其返回值是刚分配的TCB的指针。 acoral_pool_ctr_t acoral_thread_pool_ctrl;acoral_thread_t *acoral_alloc_thread(){return (acoral_thread_t *)acoral_get_res(acoral_thread_pool_ctrl); }/*资源池控制块*/ typedef struct{unsigned int type;//资源类型unsigned int size; //资源大小如线程控制块大小用sizeof(acoral_thread_t)赋值unsigned int num_per_pool;//每个资源池对象的个数unsigned int num; //已分配的资源池的个数unsigned int max_pools; //最多可以分配多少个资源池acoral_list_t *frree_pools; //空闲资源池链表acoral_list_t *pools,list[2];unsigned char *name; }资源池管理的资源内存是从第一级内存系统伙伴系统分配的为了最大限度使用内存减少内存碎片对象的个数最大值、可分配内存等都是通过计算后由用户指定的。 例如伙伴算法设定基本内存块的大小为1KB资源的大小为1KB用户一个资源池包含20个资源这样计算下来需要分配1x2020KB的空间而由于伙伴系统只能分配2i个基本内存块的大小故会分配32KB32KB可以包含32个资源对象故每个资源池的对象的个数更改为32. 线程初始化 return acoral_policy_thread_init(sched_policy,thread,route,args,data);int acoral_policy_thread_init(unsigned int policy,acoral_thread_t *thread,void (*route)(void *args),void *args,void *data){acoral_sched_policy_t *policy_ctrl;policy_ctrl acoral_get_policy_ctrl(policy);if(policy_ctrlNULL||polciy_ctrl-policy_thread_initNULL){acoral_enter_critical();acoral_release_res((acoral_res_t *)thread);acoral_exit_critical();acoral_print(No thread policy support:%d\n,thread-policy);return -1;}return policy_ctrl-policy_thread_init(thread route args,data); }int period_policy_thread_init(acoral_thread_t *thread,void (*route)(void *args),void *args,void *data){unsigned int prio;acoral_period_policy_data_t *policy_data;period_private_data_t *private_data;if(thread-polciyACORAL_SCHED_POLICY_PERIOD){policy_data (acoral_period_policy_data_t *)data;priopolicy_data-prio;if(policy_data-prio_typeACORAL_NONHARD_PRIO){prioACORAL_NONHARD_RT_PRIO_MAX;if(prioACORAL_NONHARD_RT_PRIO_MIN)prioACORAL_NONHARD_RT_PRIO_MIN-1;}thread-prio prio;private_data (period_private_data_t *)acoral_malloc(sizeof(period_private_Data_t));if(private_dataNULL){acoral_print(No level2 mem space for private_data:%s\n,thread-name);acoral_enter_critical();acoral_release_res((acoral_res_t *)thread);acoral_exit_critical();return -1;}private_data-timepolicy_data-time;private_data-routeroute;private_data-argsargs;thread-private_dataprivate_data;}if(acoral_thread_init(thread,route,period_thread_exit,args)!0){acoral_print(No thread stack:%s\n,thread-name);acoral_enter_critical();acoral_release_res((acoral_res_t *)thread);acoral_exit_critical();return -1;}acoral_resume_thread(thread);acoral_enter_critical();period_thread_delay(thread,((period_private_data_t *)thread-private_data)-time);acoral_exit_critical();return thread-res.id; }堆栈初始化 acoral_list_t acoral_threads_queue;//全局所有线程队列unsigned int acoral_thread_init(acoral_thread_t *thread,void (route)(void *args),void (*exit)(void),void *args){unsigned int stack_size thread-stack_size;if(thread-stack_buttomNULL){ //判断堆栈指针是否为NULL如果堆栈指针为NULL说明需动态分配。if(stack_sizeCFG_MIN_STACK_SIZE)stack_sizeCFG_MIN_STACK_SIZE;thread-stack_buttom(unsigned int *)acoral_malloc(stack_size);if(thread-stack_buttomNULL)return ACORAL_ERR_THREAD_NO_STACK;thread-stack_size stack_size;}thread-stack(unsigned int *)((char *)thread-stack_buttomstack_size-1);HAL_STACK_INIT(thread-stack,route,exit,args);//模拟线程创建时的堆栈环境thread-data NULL;thread-state ACORAL_THREAD_STATE_SUSPEND;acoral_init_list(thread-waiting);acoral_init_list(thread-ready);acoral_init_list(thread-timeout);acoral_init_list(thread-global_list);acoral_enter_critical();acoral_list_add2_tail(thread-global_list,acoral_threads_queue);//将刚创建的线程挂到全局队列尾部acoral_exit_critical();return 0; }HAL_STACK_INIT()是与硬件相关的函数不同处理器有不同寄存器这些寄存器体现了当前线程的运行环境如果当前线程被其它中断或线程所抢占将发生上下文切换。 需要通过堆栈来保存被抢占线程的运行环境那先保存哪个寄存器再保存哪个寄存器这就需要根据处理器的结构而定HAL_STACK_INIT()就是用来规定寄存器保存顺序的。 typedef struct{unsigned int primask;unsigned int r4; ///通用寄存器unsigned int r5; ///通用寄存器unsigned int r6; ///通用寄存器unsigned int r7; ///通用寄存器unsigned int r8; ///通用寄存器unsigned int r9; ///通用寄存器unsigned int r10; ///通用寄存器unsigned int r11; ///通用寄存器unsigned int r0; ///通用寄存器unsigned int r1; ///通用寄存器unsigned int r2; ///通用寄存器unsigned int r3; ///通用寄存器unsigned int r12; ///通用寄存器unsigned int lr;unsigned int pc;unsigned int cpsr; }hal_ctx_t;primask用于保存中断优先级屏蔽寄存器的值r0~r11通用寄存器用于保存临时变量、函数参数和返回值r12通用寄存器用于保存调用者的中间值lr链接寄存器保存跳转指令返回时的地址pc程序计数器保存当前正在执行的指令地址cpsr程序状态寄存器保存了当前CPU的状态包括标志位和CPU模式等。 由于是用C语言来模拟线程创建时的堆栈环境所以用宏转换定义hal_stack_init()来实现HAL_STACK_INIT() HAL_STACK_INIT(thread-stack,route,exit,args); void hal_stack_init(acoral_u32 **stk,void (*route)(),void (*exti)(),void *args){hal_ctx_t *ctx *stk;ctx--;ctx(hal_ctx_t *)((unsigned int *)ctx1);ctx-r0(unsigned int)args;ctx-r10;ctx-r22;ctx-r33;ctx-r44;ctx-r55;ctx-r66;ctx-r77;ctx-r88;ctx-r99;ctx-r1010;ctx-r1111;ctx-r1212;ctx-lr(unsigned int)exit;ctx-pc(unsigned int)route;ctx-primask0;*stk(unsigned int *)ctx; //将指针传给stk而stk是用户创建堆栈指针变量地址 }挂载线程到就绪队列 void resume_thrad(acoral_thread_t *thread){if(!(thread-stateACORAL_THREAD_STATE_SUSPEND)) //如果当前状态不处于suspend状态则不需要唤醒。return;acoral_enter_critical();acoral_rdyqueue_add(thread);acoral_exit_critical();acoral_sched(); }void acoral_rdy_thread(acoral_thread_t *thread){if(!(ACORAL_THREAD_STATE_SUSPENDthread-state))return;acoral_rdyqueue_add(thread); }//acoral就绪队列 typedef struct{unsigned int num;//就绪的线程数unsigned int bitmap[PRIO_BITMAP_SIZE];acoral_list_t queue[ACORAL_MAX_PRIO_NUM]; }acoral_rdy_queue_t;acoral_rdy_queue_t acoral_ready_queues;void acoral_rdyqueue_add(acoral_thread_t *thread){acoral_rdy_queue_t *rdy_queue;rdy_queue acoral_ready_queues;acoral_prio_queue_add(rdy_queue,thread-prio,thread-ready);thread-state ~ACORAL_THREAD_STATE_SUSPEND;thread-state | ACORAL_THREAD_STATE_READY;aoral_set_need_sched(true); }void acoral_prio_queue_add(acoral_rdy_queue_t *array,unsigned char prio,acoral_list_t *list){acoral_list_t *queue;acoral_list_t *head;array-num;queue array-queue prio; //根据线程优先级找到线程所在的优先级链表head queue;acoral_list_add_tail(list,head); //将该线程挂到优先级链表上acoral_set_bit(prio,array-bitmap); }调用acoral_sched() 一个普通线程创建的最后一步是调用内核调度函数acoral_sched() 真正意义上的多任务操作系统都要通过一个调度程序Scheduler来实现调度功能该调度程序以函数形式存在用来实现操作系统的调度策略可在内核的各个部分进行调用。 调用调度程序的具体位置又被称为是一个调度点由于调度通常是由外部事件的中断来触发的或者由周期性的时钟信号触发因此调度点通常出于以下位置 中断服务程序结束的位置。例如当用户通过按键向系统提出新的请求系统首先以中断服务程序ISR响应用户请求。然后在中断服务程序结束时创建新的任务并将新任务挂载到就绪队列尾部。接下来RTOS会进入一个调度点调用调度程序执行相应的调度策略。又如当I/O中断发生时如果I/O事是一个或多个任务正在等待的事件则在I/O中断结束时刻也将会进入一个调度点调用调度程序调度程序将根据调度策略确定是否继续执行当前处于运行状态的任务或是让高优先级任务抢占低优先级任务。运行任务因缺乏资源而被阻塞的时刻。例如使用串口UART传输数据如果UART此时正在被其他任务使用这将导致当前任务从就绪状态变为等待状态不能继续执行而RTOS会进入一个调度点调用调度程序。任务周期开始或结束时。高优先级任务就绪的时刻如果采用基于优先级抢占式调度策略。 普通线程创建流程 为线程分配空间然后根据创建线程的调度策略对线程TCB进行相关的初始化然后对线程的堆栈进行初始化将创建的线程挂到就绪队列上供内核调度
http://www.w-s-a.com/news/242980/

相关文章:

  • 公司网站app怎么做杭州建设局网站
  • 网站开发需要自己写代码吗12306网站多少钱做的
  • 策勒网站建设四川建设网有限责任公司招聘
  • 网站建设哪里有学网页界面设计论文
  • 怎么做外贸网站推广劳务公司网站怎么做
  • 滴答手表网站中铁建设集团有限公司招聘信息2021
  • 重庆富通科技有限公司网站新闻头条最新消息国家大事
  • 四字母net做网站怎么样企业代运营公司
  • 纪检网站建设方案wordpress首页静态页面
  • 网站右下角浮动效果如何做网站logo设计在线生成
  • 西宁哪里做网站婚纱摄影网站设计思路
  • 凡科用模板做网站网站导入页欣赏
  • 北京响应式网站建设公司十大小程序开发公司
  • dw网站开发删除wordpress主题底部
  • 织梦网站怎样做子域名高德导航怎么看街景地图
  • 宿州专业网站建设株洲网站建设优化
  • 自动生成海报的网站常州建网站公司
  • 网站刷流量对网站有影响吗站长工具欧美高清
  • 百度做网站优化多少钱一年罗庄网站建设
  • 手机网站 自适应屏幕h5网站有哪些
  • 北京企业建站技术临沂网站公众号建设
  • 域名和网站备案一样吗wordpress 封装 app
  • 婚纱摄影网站开题报告c2c模式是什么意思
  • 网站几种颜色wordpress水平菜单
  • php做网站的分站wordpress边下边看
  • 杭州建设实名制报备网站Wordpress外贸网站搭建公司
  • 山西云起时网站建设计算机网站开发实现总结
  • 一个网站做两个优化可以做吗永清网站建设
  • wordpress英文采集wordpress seo 链接
  • 进入建设银行的网站就打不了字工程建设标准化网站