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

长沙做痔疮东大医院de网站常德网站建设案例教程

长沙做痔疮东大医院de网站,常德网站建设案例教程,免费论坛申请无广告,自己做的网站买域名多少钱内核移植 内核移植就是指将RT-Thread内核在不同的芯片架构、不同的板卡上运行起来。 移植可分为CPU架构移植和BSP板级支持包移植两部分。 CPU架构移植 在嵌入式领域有多种不同CPU架构#xff0c;例如Cortex-M、ARM920T、MIPS32、RISC-V等等。 为了使RT-Thread能够在不同C…内核移植 内核移植就是指将RT-Thread内核在不同的芯片架构、不同的板卡上运行起来。 移植可分为CPU架构移植和BSP板级支持包移植两部分。 CPU架构移植 在嵌入式领域有多种不同CPU架构例如Cortex-M、ARM920T、MIPS32、RISC-V等等。 为了使RT-Thread能够在不同CPU架构的芯片上运行RT-Thread提供了一个libcpu抽象层来适配不同的CPU架构。 libcpu层向上对内核提供统一的接口包括全局中断的开关线程栈的初始化上下文切换等。 RT-Thread 的 libcpu 抽象层向下提供了一套统一的 CPU 架构移植接口这部分接口包含了全局中断开关函数、线程上下文切换函数、时钟节拍的配置和中断函数、Cache 等等内容。下表是 CPU 架构移植需要实现的接口和变量。 libcpu移植相关API rt_uint32_t rt_thread_switch_interrupt_flag;表示需要再中断里进行切换的标志 rt_uint32_t rt_interrupt_from_thread, rt_interrupt_to_thread; 在线程进行上下文切换时候用来保存 from 和 to 线程 实现全局中断开关 无论内核代码还是用户的代码都可能存在一些变量需要在多个线程或者中断里面使用如果没有相应的保护机制那就可能导致临界区问题。 RT-Thread里为了解决这个问题提供了一系列的线程间同步和通信机制来解决。但是这些机制都需要用到libcpu里提供的全局中断开关函数。 rt_base_t rt_hw_interrupt_disbale(void);void rt_hw_interrupt_enable(rt_base_t level);关闭全局中断 在rt_hw_interrupt_disable()函数里需要依次完成的功能是 保存当前的全局中断状态并把状态作为函数的返回值关闭全局中断 rt_hw_interrupt_disable PROCEXPORT rt_hw_interrupt_disable MRS r0,PRIMASKCPSID IBX LRENDPr0存储的数据就是函数的返回值。 打开全局中断 rt_hw_interrupt_enable PROCEXPORT rt_hw_interrupt_enable MSR PRIMASK,r0BX LRENDP实现线程栈初始化 在动态创建线程和初始化线程的时候会使用到内部的线程初始化函数_rt_thread_init()这个函数会调用栈初始化函数rt_hw_stack_init()在栈初始化函数里会手动构造一个上下文内容这个上下文内容将被作为每个线程第一次执行的初始值。 rt_uint8_t *rt_hw_stack_init(void *tentry, void *parameter, rt_uint8_t *stack_addr, void *texit) {struct stack_frame *stack_frame;rt_uint8_t *stk;unsigned long i;/* 对传入的栈指针做对齐处理 */stk stack_addr sizeof(rt_uint32_t);stk (rt_uint8_t *)RT_ALIGN_DOWN((rt_uint32_t)stk, 8);stk - sizeof(struct stack_frame);stack_frame (struct stack_frame *)stk;for(i0; isizeof(struct stack_frame)/sizeof(rt_uint32_t); i){((rt_uint32_t *)stack_frame)[i] oxdeadbeef;}//将一个参数保存在r0寄存器stack_frame-exception_stack_frame.r0 (unsigned long)parameter;/* 将剩下的参数寄存器都设置为 0 */stack_frame-exception_stack_frame.r1 0; /* r1 寄存器 */stack_frame-exception_stack_frame.r2 0; /* r2 寄存器 */stack_frame-exception_stack_frame.r3 0; /* r3 寄存器 */stack_frame-exception_stack_frame.r12 0;stack_frame-exception_stack_frame.lr (unsigned long)texit;stack_frame-exception_stack_frame.pc (unsigned long)tentry;stack_frame-exception_stack_frame.psr 0x01000000L;//设置psr的值为这个表示默认切换过去是Thumb模式return stk; }实现上下文切换 在不同的CPU架构里线程之间的上下文切换和中断到线程的上下文切换上下文的寄存器部分可能是有差异的也可能是一样的。 在Cortex-M里面上下文切换都是统一使用PendSV异常来完成切换部分并没有差异。 但是为了能适应不同的CPU架构RT-Thread的libcpu抽象层还是需要实现三个线程切换相关的函数 1 rt_hw_context_switch_to()没有来源线程切换到目标线程在调度器启动第一个线程的时候被调用。 2 rt_hw_context_switch()在线程环境下从当前线程切换到目标线程。 3 rt_hw_context_switch_interrupt ()在中断环境下从当前线程切换到目标线程。 在线程环境下进行切换和在中断环境进行切换是存在差异的。 线程环境下如果调用rt_hw_context_switch()函数那么可以马上进行上下文切换而在中断环境下需要等待中断处理函数完成之后才能进行切换。 由于这种差异在 ARM9 等平台rt_hw_context_switch() 和 rt_hw_context_switch_interrupt() 的实现并不一样。 在中断处理程序里如果触发了线程的调度调度函数里会调用rt_hw_context_switch_interrupt()触发上下文切换。 中断处理程序里处理完中断事务之后中断退出之前检查flag变量如果变量的值为1就根据from_thread和to_thread变量完成线程的上下文切换。 在Cortex-M处理器架构里基于自动部分压栈和PendSV的特性上下文切换可以实现地更加简洁。 硬件在进入PendSV中断之前自动保存了from线程的PSR、PC、LR、R12、R3-R0寄存器然后PendSV里保存from线程的R4-R11寄存器以及恢复to线程的R4-R11寄存器最后硬件在退出 PendSV 中断之后自动恢复 to 线程的 R0~R3、R12、LR、PC、PSR 寄存器。 中断到线程的上下文切换 硬件在进入中断之前自动保存了 from 线程的 PSR、PC、LR、R12、R3-R0 寄存器然后触发了 PendSV 异常。在 PendSV 异常处理函数里保存 from 线程的 R11~R4 寄存器以及恢复 to 线程的 R4~R11 寄存器最后硬件在退出 PendSV 中断之后自动恢复 to 线程的 R0~R3、R12、PSR、PC、LR 寄存器。 显然在Cortex-M内核里rt_hw_context_switch() 和 rt_hw_context_switch_interrupt() 功能一致都是在 PendSV 里完成剩余上下文的保存和回复。所以我们仅仅需要实现一份代码简化移植的工作。 实现PendSV中断 在Cortex-M3里PendSV中断处理函数是PendSV_Handler() ; r0 -- switch from thread stack ; r1 -- switch to thread stack ; psr, pc, lr, r12, r3, r2, r1, r0 are pushed into [from] stackPendSV_Handler PROCEXPORT PendSV_Handler ;关闭全局中断MRS r2,PRIMASKCPSID I; 检查 rt_thread_switch_interrupt_flag 变量是否为 0; 如果为零就跳转到 pendsv_exitLDR r0, rt_thread_switch_interrupt_flagLDR r1, [r0]CBZ r1, pendsv_exit ; pendsv already handled清零 rt_thread_switch_interrupt_flag 变量MOV r1, #0x00STR r1, [r0]; 检查 rt_interrupt_from_thread 变量是否为 0; 如果为 0就不进行 from 线程的上下文保存LDR r0, rt_interrupt_from_threadLDR r1, [r0]CBZ r1, switch_to_thread; 保存 from 线程的上下文MRS r1, psp ; 获取 from 线程的栈指针STMFD r1!, {r4 - r11} ; 将 r4~r11 保存到线程的栈里LDR r0, [r0]STR r1, [r0] ; 更新线程的控制块的 SP 指针switch_to_threadLDR r1, rt_interrupt_to_threadLDR r1, [r1]LDR r1, [r1] ; 获取 to 线程的栈指针LDMFD r1!, {r4 - r11} ; 从 to 线程的栈里恢复 to 线程的寄存器值MSR psp, r1 ; 更新 r1 的值到 psppendsv_exitMSR PRIMASK,r2;修改lr寄存器的bit2确保进程使用PSP堆栈指针ORR lr,lr,#0x04;退出中断函数BX lrENDP
http://www.w-s-a.com/news/103040/

相关文章:

  • 昆明工程建设信息网站柳州网站建设公司哪家好
  • 如何分析网站关键词北京门户网站网址
  • 做网站与做游戏那个好网站域名怎么起
  • 有没有做cad单的网站银行网站建设方案视频
  • 和各大网站做视频的工作高校网站群管理系统
  • 中国建设人才服务信息网是正规网站怎么注销自己名下的公司
  • 网站开发新型技术那些网站做任务领q币
  • 海口手机网站建设wordpress微支付宝
  • 做公司网站需要几天深圳自定义网站开发
  • 做网站学多长时间可以学会推广软件公司
  • 网络网站设计培训长沙建站模板大全
  • 站群搭建移动端处理器天梯图
  • 岳池发展建设集团有限公司门户网站湛江seo咨询
  • 手机网站工具关键词排名是什么意思
  • 游民星空是谁做的网站沈阳网站托管公司
  • 做网站搭建需要什么人vs2017移动网站开发
  • 购物网站开发需要什么技术怎么查看网站是否备案
  • 学做电商那个网站好网站建设投票主题
  • 中卫网站推广网络营销毕业设计做网站大小有什么要求
  • 做问卷网站义乌网站建设推广专家
  • 不会编程怎样建设网站昆明做网站哪家
  • 直播网站模板新营销平台电商网站
  • 建设部指定招标网站免费的企业查询软件
  • 做前端常用的网站及软件下载平台优化是什么意思
  • 企石镇仿做网站wordpress 网站白屏
  • 班级网站建设规划书专业定制网红变色杯
  • 上海网站设计公司电话甘肃路桥建设集团有限公司官方网站
  • 哈尔滨网站建设网站开发陕西省建设监理工程协会网站
  • 微信公众号电商网站开发wordpress增加论坛
  • 网站建设视频百度网盘下载免费wordpress搭建