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

网站推广策略怎么写商丘市网站建设公司

网站推广策略怎么写,商丘市网站建设公司,萧山工程建设有限公司网站,仪征网站建设目录 往期文章传送门 一、什么是多任务 二、代码实现 三、测试 往期文章传送门 开发一个RISC-V上的操作系统#xff08;一#xff09;—— 环境搭建_riscv开发环境_Patarw_Li的博客-CSDN博客 开发一个RISC-V上的操作系统#xff08;二#xff09;—— 系统引导程序一—— 环境搭建_riscv开发环境_Patarw_Li的博客-CSDN博客 开发一个RISC-V上的操作系统二—— 系统引导程序Bootloader_Patarw_Li的博客-CSDN博客 开发一个RISC-V上的操作系统三—— 串口驱动程序UART_Patarw_Li的博客-CSDN博客 开发一个RISC-V上的操作系统四—— 内存管理_Patarw_Li的博客-CSDN博客 本节的代码在仓库的03_MUTI_TASK目录下仓库链接riscv_os: 一个RISC-V上的简易操作系统 本文代码的运行调试会在前面开发的RISC-V处理器上进行仓库链接cpu_prj: 一个基于RISC-V指令集的CPU实现 一、什么是多任务 一个任务可以看作一个任务函数的执行流如在一些简单的单片机系统中只有一个任务即main函数 int main(void) {/* 初始化 */while(1){/* 循环处理多项事情 */} } ​ 那么什么是多任务呢百度百科是这样解释的 当多任务操作系统使用某种任务调度策略允许两个或更多任务并发共享一个处理器时事实上处理器在某一时刻只会给一件任务提供服务。因为任务调度机制保证不同任务之间的切换速度十分迅速因此给人多个任务同时运行的错觉。  因此多任务可以看作多个任务函数的执行流但光有多个任务还不够还要实现任务的并发执行 ​ 并发可以理解为分时复用就像把一段时间切成多个小段每个任务轮流执行一个小段的时间在宏观上这段时间内有多个任务同时执行在微观上某一时刻只有一个任务在执行这就是任务的并发执行要实现任务的并发就涉及到一个非常重要的操作——任务的切换。 任务的切换的步骤为保存当前任务的上下文找到下一个任务恢复下一个任务的上下文开始执行下一个任务。那么什么是任务的上下文呢 任务的上下文简单来说就是任务的执行时环境对于简单的多任务操作系统我们这里就是任务的上下文仅仅包含一些通用寄存器我们将当前任务的各个通用寄存器保存起来等待再次执行时先恢复各个通用寄存器的内容再开始执行从而实现任务的切换。如果是复杂一点的操作系统的话上下文还包含一些进程打开的文件、内存信息等等。 ​ 多任务系统分为协作式多任务和抢占式多任务我们这里要实现的是协作式多任务即任务自己主动放弃处理器的模式 ​ 二、代码实现 先来讲解一下协作式多任务系统切换流程。 如下图所示TASK A 和 TASK B是两个任务Context A 和 Context B为对应任务的上下文中间的switch_to为切换函数 开始执行任务A时csr寄存器mscratch指向任务A的上下文 执行到call switch_to时代表任务A让出cpu调用任务切换函数switch_to 首先要保存任务A的上下文保存到 Context A 结构体中其中ra寄存器中保存的是当前任务A执行的位置 然后再切换上下文mscratch寄存器指向 Context B再取任务B的上下文从 Context B 结构体中获取然后将上下文恢复到对应的寄存器中这里ra寄存器的内容为任务B上次执行的位置 当我们恢复ra寄存器内容后再调用ret指令后PC就会跳转到任务B上一次执行的位置继续执行从而实现任务的切换 下面是切换函数switch_to的代码是使用汇编写的在 03_MUTI_TASK/entry.S文件中 # Save all General-Purpose(GP) registers to context. # struct context *base ctx_task; # base-ra ra; # ...... # These GP registers to be saved dont include gp # and tp, because they are not caller-saved or # callee-saved. These two registers are often used # for special purpose. For example, in RVOS, tp # (aka thread pointer) is used to store hartid, # which is a global value and would not be changed # during context-switch. .macro reg_save basesw ra, 0(\base)sw sp, 4(\base)sw t0, 16(\base)sw t1, 20(\base)sw t2, 24(\base)sw s0, 28(\base)sw s1, 32(\base)sw a0, 36(\base)sw a1, 40(\base)sw a2, 44(\base)sw a3, 48(\base)sw a4, 52(\base)sw a5, 56(\base)sw a6, 60(\base)sw a7, 64(\base)sw s2, 68(\base)sw s3, 72(\base)sw s4, 76(\base)sw s5, 80(\base)sw s6, 84(\base)sw s7, 88(\base)sw s8, 92(\base)sw s9, 96(\base)sw s10, 100(\base)sw s11, 104(\base)sw t3, 108(\base)sw t4, 112(\base)sw t5, 116(\base)# we dont save t6 here, due to we have used# it as base, we have to save t6 in an extra step# outside of reg_save .endm# restore all General-Purpose(GP) registers from the context # except gp tp. # struct context *base ctx_task; # ra base-ra; # ...... .macro reg_restore baselw ra, 0(\base)lw sp, 4(\base)lw t0, 16(\base)lw t1, 20(\base)lw t2, 24(\base)lw s0, 28(\base)lw s1, 32(\base)lw a0, 36(\base)lw a1, 40(\base)lw a2, 44(\base)lw a3, 48(\base)lw a4, 52(\base)lw a5, 56(\base)lw a6, 60(\base)lw a7, 64(\base)lw s2, 68(\base)lw s3, 72(\base)lw s4, 76(\base)lw s5, 80(\base)lw s6, 84(\base)lw s7, 88(\base)lw s8, 92(\base)lw s9, 96(\base)lw s10, 100(\base)lw s11, 104(\base)lw t3, 108(\base)lw t4, 112(\base)lw t5, 116(\base)lw t6, 120(\base) .endm# Something to note about save/restore: # - We use mscratch to hold a pointer to context of current task # - We use t6 as the base for reg_save/reg_restore, because it is the # very bottom register (x31) and would not be overwritten during loading. # Note: CSRs(mscratch) can not be used as base due to load/restore # instruction only accept general purpose registers..text# void switch_to(struct context *next); # a0: pointer to the context of the next task .globl switch_to .align 4 switch_to:csrrw t6, mscratch, t6 # swap t6 and mscratchbeqz t6, 1f # Note: the first time switch_to() is# called, mscratch is initialized as zero# (in sched_init()), which makes t6 zero,# and thats the special case we have to# handle with t6reg_save t6 # save context of prev task# Save the actual t6 register, which we swapped into# mscratchmv t5, t6 # t5 points to the context of current taskcsrr t6, mscratch # read t6 back from mscratchsw t6, 120(t5) # save t6 with t5 as base1:# switch mscratch to point to the context of the next taskcsrw mscratch, a0# Restore all GP registers# Use t6 to point to the context of the new taskmv t6, a0reg_restore t6# Do actual context switching.ret.end .macro 定义两个宏函数reg_save  base 和 reg_restore  basereg_save  base 作用是把通用寄存器内容存储到以base为基地址的空间中即保存上下文而 reg_restore  base 则是把以base为基地址的通用寄存器内容取出放到各个寄存器中即恢复上下文。 下面是任务创建、调度相关的函数在 03_MUTI_TASK/sched.c 文件中 #include inc/os.h/* defined in entry.S */ extern void switch_to(context *next);#define MAX_TASKS 4 #define STACK_SIZE 128 /** In the standard RISC-V calling convention, the stack pointer sp* is always 16-byte aligned.*/ uint8_t __attribute__((aligned(16))) task_stack[MAX_TASKS][STACK_SIZE];context ctx_tasks[MAX_TASKS];/** _top is used to mark the max available position of ctx_tasks* _current is used to point to the context of current task*/ static uint8_t _top 0; static uint8_t _current -1;static void w_mscratch(reg_t x) {asm volatile(csrw mscratch, %0 : : r (x)); }void sched_init() {w_mscratch(0); }/** implment a simple cycle FIFO schedular*/ void schedule() {if (_top 0) {panic(Num of task should be greater than zero!);return;}_current (_current 1) % _top;context *next (ctx_tasks[_current]);switch_to(next); }/** DESCRIPTION* Create a task.* - start_routin: task routine entry* RETURN VALUE* 0: success* -1: if error occured*/ uint8_t task_create(void (*start_routin)(void)) {if (_top MAX_TASKS) {ctx_tasks[_top].sp (reg_t) task_stack[_top][STACK_SIZE];ctx_tasks[_top].ra (reg_t) start_routin;_top;return 0;} else {return -1;} }/** DESCRIPTION* task_yield() causes the calling task to relinquish the CPU and a new* task gets to run.*/ void task_yield() {schedule(); }/** a very rough implementaion, just to consume the cpu*/ void task_delay(volatile int count) {count * 50000;while (count--); } sched_init() 函数用于初始化mscratch寄存器。schedule() 函数则用于切换任务。task_create(void (*start_routin)(void)) 函数用于创建任务传入的参数为任务函数的入口地址。 下面是任务的定义在 03_MUTI_TASK/user.c 文件中 #include inc/os.h#define DELAY 1000void user_task0(void) {uart_puts(Task 0: Created!\n);while (1) {uart_puts(Task 0: Running...\n);task_delay(DELAY);task_yield();} }void user_task1(void) {uart_puts(Task 1: Created!\n);while (1) {uart_puts(Task 1: Running...\n);task_delay(DELAY);task_yield();} }/* NOTICE: DONT LOOP INFINITELY IN main() */ void os_main(void) {task_create(user_task0);task_create(user_task1); } 其中os_main函数仅仅用于创建两个任务之后不会执行。两个任务执行的内容为先打印信息然后delay最后让出cpu给另外一个任务执行依此循环。 三、测试 为了测试多任务执行效果03_MUTI_TASK/kernal.c 的内容如下 #include inc/os.hextern void os_main(void);void start_kernel(void){uart_init();uart_puts(Hello World!\n);page_init();sched_init();os_main();schedule();uart_puts(Would not go here!\n);while(1){}; // stop here! } 然后编译烧录程序到RISC-V处理器上执行这一步看我前面的文章运行效果如下 可以看到 task 1 和 task 0 分时执行这样我们的多任务部分就验证成功啦 遇到问题欢迎加群 892873718 交流~
文章转载自:
http://www.morning.tqxtx.cn.gov.cn.tqxtx.cn
http://www.morning.hhxpl.cn.gov.cn.hhxpl.cn
http://www.morning.mfrb.cn.gov.cn.mfrb.cn
http://www.morning.gnkbf.cn.gov.cn.gnkbf.cn
http://www.morning.mmosan.com.gov.cn.mmosan.com
http://www.morning.mtjwp.cn.gov.cn.mtjwp.cn
http://www.morning.dbnpz.cn.gov.cn.dbnpz.cn
http://www.morning.bzwxr.cn.gov.cn.bzwxr.cn
http://www.morning.zxhpx.cn.gov.cn.zxhpx.cn
http://www.morning.youyouling.cn.gov.cn.youyouling.cn
http://www.morning.qqtzn.cn.gov.cn.qqtzn.cn
http://www.morning.klrpm.cn.gov.cn.klrpm.cn
http://www.morning.rwmqp.cn.gov.cn.rwmqp.cn
http://www.morning.mhnb.cn.gov.cn.mhnb.cn
http://www.morning.gczzm.cn.gov.cn.gczzm.cn
http://www.morning.tqhpt.cn.gov.cn.tqhpt.cn
http://www.morning.tfkqc.cn.gov.cn.tfkqc.cn
http://www.morning.splcc.cn.gov.cn.splcc.cn
http://www.morning.xinyishufa.cn.gov.cn.xinyishufa.cn
http://www.morning.xxfxxf.cn.gov.cn.xxfxxf.cn
http://www.morning.byrlg.cn.gov.cn.byrlg.cn
http://www.morning.kcsx.cn.gov.cn.kcsx.cn
http://www.morning.uycvv.cn.gov.cn.uycvv.cn
http://www.morning.yfstt.cn.gov.cn.yfstt.cn
http://www.morning.cpnlq.cn.gov.cn.cpnlq.cn
http://www.morning.tcxk.cn.gov.cn.tcxk.cn
http://www.morning.bfsqz.cn.gov.cn.bfsqz.cn
http://www.morning.dmnqh.cn.gov.cn.dmnqh.cn
http://www.morning.yqtry.cn.gov.cn.yqtry.cn
http://www.morning.nrbcx.cn.gov.cn.nrbcx.cn
http://www.morning.lanyee.com.cn.gov.cn.lanyee.com.cn
http://www.morning.xyhql.cn.gov.cn.xyhql.cn
http://www.morning.mnsts.cn.gov.cn.mnsts.cn
http://www.morning.rbsxf.cn.gov.cn.rbsxf.cn
http://www.morning.bgqr.cn.gov.cn.bgqr.cn
http://www.morning.fjptn.cn.gov.cn.fjptn.cn
http://www.morning.jcwt.cn.gov.cn.jcwt.cn
http://www.morning.xcjwm.cn.gov.cn.xcjwm.cn
http://www.morning.skbbt.cn.gov.cn.skbbt.cn
http://www.morning.pwmpn.cn.gov.cn.pwmpn.cn
http://www.morning.xckdn.cn.gov.cn.xckdn.cn
http://www.morning.ltxgk.cn.gov.cn.ltxgk.cn
http://www.morning.twpq.cn.gov.cn.twpq.cn
http://www.morning.ljqd.cn.gov.cn.ljqd.cn
http://www.morning.mwqbp.cn.gov.cn.mwqbp.cn
http://www.morning.vvbsxm.cn.gov.cn.vvbsxm.cn
http://www.morning.bbtn.cn.gov.cn.bbtn.cn
http://www.morning.jlmrx.cn.gov.cn.jlmrx.cn
http://www.morning.wctqc.cn.gov.cn.wctqc.cn
http://www.morning.yrkdq.cn.gov.cn.yrkdq.cn
http://www.morning.ylrxd.cn.gov.cn.ylrxd.cn
http://www.morning.bpmdx.cn.gov.cn.bpmdx.cn
http://www.morning.plhyc.cn.gov.cn.plhyc.cn
http://www.morning.jcwrb.cn.gov.cn.jcwrb.cn
http://www.morning.bdqpl.cn.gov.cn.bdqpl.cn
http://www.morning.ctqlq.cn.gov.cn.ctqlq.cn
http://www.morning.bqts.cn.gov.cn.bqts.cn
http://www.morning.nqbkb.cn.gov.cn.nqbkb.cn
http://www.morning.lcdtb.cn.gov.cn.lcdtb.cn
http://www.morning.rfhwc.cn.gov.cn.rfhwc.cn
http://www.morning.vjwkb.cn.gov.cn.vjwkb.cn
http://www.morning.lrskd.cn.gov.cn.lrskd.cn
http://www.morning.rttkl.cn.gov.cn.rttkl.cn
http://www.morning.hkysq.cn.gov.cn.hkysq.cn
http://www.morning.rfzbm.cn.gov.cn.rfzbm.cn
http://www.morning.ktqtf.cn.gov.cn.ktqtf.cn
http://www.morning.tkchg.cn.gov.cn.tkchg.cn
http://www.morning.jtnph.cn.gov.cn.jtnph.cn
http://www.morning.bpmtx.cn.gov.cn.bpmtx.cn
http://www.morning.lxfdh.cn.gov.cn.lxfdh.cn
http://www.morning.jqjnl.cn.gov.cn.jqjnl.cn
http://www.morning.drgmr.cn.gov.cn.drgmr.cn
http://www.morning.wjyyg.cn.gov.cn.wjyyg.cn
http://www.morning.gbybx.cn.gov.cn.gbybx.cn
http://www.morning.lpcct.cn.gov.cn.lpcct.cn
http://www.morning.wxwall.com.gov.cn.wxwall.com
http://www.morning.tqsmc.cn.gov.cn.tqsmc.cn
http://www.morning.ghzfx.cn.gov.cn.ghzfx.cn
http://www.morning.jfbbq.cn.gov.cn.jfbbq.cn
http://www.morning.lcbt.cn.gov.cn.lcbt.cn
http://www.tj-hxxt.cn/news/268556.html

相关文章:

  • 个人网站搭建步骤去外包公司的利与弊
  • 网站维护教程上海市建筑建材业网招标公告
  • 天津做网站那家好富平网站建设
  • 网站托管免费镇海建设银行网站
  • 百度最新泛站群程序抖音代运营合同模板免费下载
  • 做网站优化两年遇到的SEO常态wordpress 淘宝联盟
  • 什么是网站的原型做网站用什么笔记本
  • 深圳微信分销网站公司西安wordpress主题
  • 蒙牛官网网站怎么做的网站建设i rsky
  • 网站建设推广费用无锡锡山网站建设
  • 如何建立公司网站是什么免费下载百度并安装
  • 网站建设用dw上海 网站制作
  • 网站内容怎么编辑查公司名称是否已经被注册
  • 武侯区建设局门户网站如何用二级域名做网站
  • 大良营销网站建设市场做网站前端有前途么
  • 提供盐城网站开发网站开发中如何制作登录页面
  • 潍坊网站建设wancet西部数码网站管理助手2
  • 12306网站为什么做不好使个人可否建立网站
  • 湖北建设招标网 官方网站php网站如何编辑
  • 常熟网站建设专业的公司收到一张网站服务费怎么做凭证
  • 羽毛球网站建设网站在线制作网站源码
  • wordpress 前台注册广州网站设计实力乐云seo
  • 邢台wap网站建设报价绚丽的网站欣赏
  • 光山网站建设电商设计师的工作内容
  • 学信网网站建设怎么搞photoshop永久免费版
  • 企业网站的建设流程网站建设运营
  • 网站服务器如何维护网站专题分类
  • c语言可以做网站吗济南旅游网站建设
  • 搭建一个网站大概需要多少钱python网站开发好吗
  • 网站开发技术工作室怎样进入网站管理系统