0
  • 聊天消息
  • 系統(tǒng)消息
  • 評論與回復
登錄后你可以
  • 下載海量資料
  • 學習在線課程
  • 觀看技術視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會員中心
創(chuàng)作中心

完善資料讓更多小伙伴認識你,還能領取20積分哦,立即完善>

3天內(nèi)不再提示

RISC-V上下文切換匯編代碼注釋

冬至子 ? 來源:藥RV ? 作者:藥RV ? 2023-10-12 12:37 ? 次閱讀

線程與線程間上下文切換

/*

Copyright (c) 2006-2018, RT-Thread Development Team

SPDX-License-Identifier: Apache-2.0

Change Logs:
Date Author Notes
2018/10/28 Bernard The unify RISC-V porting implementation
2018/12/27 Jesven Add SMP support
2020/11/20 BalanceTWK Add FPU support
/
#include "cpuport.h"
.globl rt_hw_interrupt_disable /
關全局中斷 /
rt_hw_interrupt_disable:
//將mstatus寄存器與立即數(shù)0x1000(8UL)對應位為1的地方置0 將mststus的值保存至a0寄存器
csrrci a0, mstatus, 8
ret /
一般返回 (return)/
.globl rt_hw_interrupt_enable
rt_hw_interrupt_enable:
csrw mstatus, a0 /
將a0的值加載至mstatus寄存器 /
ret
.globl rt_hw_context_switch_to /
調度器啟動后啟動第一個任務 /
rt_hw_context_switch_to:
LOAD sp, (a0) /
將第一個線程的線程棧加載至sp寄存器 /
LOAD a0, 2 * REGBYTES(sp) /
加載初始化時預設的mstatus寄存器值 至a0寄存器 /
csrw mstatus, a0 /
將a0寄存器的值寫入mstatus寄存器 /
j rt_hw_context_switch_exit
/
跳轉至rt_hw_context_switch_exit函數(shù) 執(zhí)行加載下文(將預設的棧中的內(nèi)容加載至系統(tǒng)寄存器) /
.globl rt_hw_context_switch /
線程間上下文切換函數(shù) /
rt_hw_context_switch:
/
saved from thread context

x1/ra       - > sp(0)

x1/ra -> sp(1)


mstatus.mie - > sp(2)

x(i) -> sp(i-4)


/
#ifdef ARCH_RISCV_FPU /
若支持硬件浮點運算 則執(zhí)行下述內(nèi)容 /
addi sp, sp, -32 * FREGBYTES /
從棧中開辟出空間 保存浮點寄存器 /
FSTORE f0, 0 * FREGBYTES(sp) /
浮點寄存器保存開始 .../
FSTORE f1, 1 * FREGBYTES(sp)
FSTORE f2, 2 * FREGBYTES(sp)
FSTORE f3, 3 * FREGBYTES(sp)
FSTORE f4, 4 * FREGBYTES(sp)
FSTORE f5, 5 * FREGBYTES(sp)
FSTORE f6, 6 * FREGBYTES(sp)
FSTORE f7, 7 * FREGBYTES(sp)
FSTORE f8, 8 * FREGBYTES(sp)
FSTORE f9, 9 * FREGBYTES(sp)
FSTORE f10, 10 * FREGBYTES(sp)
FSTORE f11, 11 * FREGBYTES(sp)
FSTORE f12, 12 * FREGBYTES(sp)
FSTORE f13, 13 * FREGBYTES(sp)
FSTORE f14, 14 * FREGBYTES(sp)
FSTORE f15, 15 * FREGBYTES(sp)
FSTORE f16, 16 * FREGBYTES(sp)
FSTORE f17, 17 * FREGBYTES(sp)
FSTORE f18, 18 * FREGBYTES(sp)
FSTORE f19, 19 * FREGBYTES(sp)
FSTORE f20, 20 * FREGBYTES(sp)
FSTORE f21, 21 * FREGBYTES(sp)
FSTORE f22, 22 * FREGBYTES(sp)
FSTORE f23, 23 * FREGBYTES(sp)
FSTORE f24, 24 * FREGBYTES(sp)
FSTORE f25, 25 * FREGBYTES(sp)
FSTORE f26, 26 * FREGBYTES(sp)
FSTORE f27, 27 * FREGBYTES(sp)
FSTORE f28, 28 * FREGBYTES(sp)
FSTORE f29, 29 * FREGBYTES(sp)
FSTORE f30, 30 * FREGBYTES(sp)
FSTORE f31, 31 * FREGBYTES(sp)/
浮點寄存器保存結束 /
#endif
addi sp, sp, -32 * REGBYTES /
從棧中開辟出空間 保存整數(shù)寄存器 /
STORE sp, (a0) /
保存sp寄存器至 from線程棧*/
STORE x1, 0 * REGBYTES(sp) /* 保存x1寄存器至 from線程棧*/
STORE x1, 1 * REGBYTES(sp) /* 保存x1寄存器至 from線程棧*/
csrr a0, mstatus /* 將mstatus寄存器的值保存至a0寄存器 /
andi a0, a0, 8 /
將a0寄存器中的值與0x1000相與 /
beqz a0, save_mpie /
判斷a0寄存器中的值是否等于0 等于0則跳轉至 save_mpie*/
li a0, 0x80 /* 非0則將立即數(shù)0x80加載至a0寄存器 /
save_mpie:
STORE a0, 2 * REGBYTES(sp) /
整數(shù)寄存器保存開始 .../
STORE x4, 4 * REGBYTES(sp)
STORE x5, 5 * REGBYTES(sp)
STORE x6, 6 * REGBYTES(sp)
STORE x7, 7 * REGBYTES(sp)
STORE x8, 8 * REGBYTES(sp)
STORE x9, 9 * REGBYTES(sp)
STORE x10, 10 * REGBYTES(sp)
STORE x11, 11 * REGBYTES(sp)
STORE x12, 12 * REGBYTES(sp)
STORE x13, 13 * REGBYTES(sp)
STORE x14, 14 * REGBYTES(sp)
STORE x15, 15 * REGBYTES(sp)
STORE x16, 16 * REGBYTES(sp)
STORE x17, 17 * REGBYTES(sp)
STORE x18, 18 * REGBYTES(sp)
STORE x19, 19 * REGBYTES(sp)
STORE x20, 20 * REGBYTES(sp)
STORE x21, 21 * REGBYTES(sp)
STORE x22, 22 * REGBYTES(sp)
STORE x23, 23 * REGBYTES(sp)
STORE x24, 24 * REGBYTES(sp)
STORE x25, 25 * REGBYTES(sp)
STORE x26, 26 * REGBYTES(sp)
STORE x27, 27 * REGBYTES(sp)
STORE x28, 28 * REGBYTES(sp)
STORE x29, 29 * REGBYTES(sp)
STORE x30, 30 * REGBYTES(sp)
STORE x31, 31 * REGBYTES(sp) /
整數(shù)寄存器保存結束 /
LOAD sp, (a1) /
加載to線程棧至sp /
j rt_hw_context_switch_exit /
跳轉至rt_hw_context_switch_exit函數(shù) 執(zhí)行加載下文 /
.global rt_hw_context_switch_exit/
加載下文函數(shù) /
rt_hw_context_switch_exit:
/
resw ra to mepc /
LOAD a0, 0 * REGBYTES(sp) /
將to線程的棧加載至a0寄存器 /
csrw mepc, a0 /
將to線程的pc加載至mepc 退出后自動將mepc寄存器的值更新值系統(tǒng)pc寄存器 /
LOAD x1, 1 * REGBYTES(sp)/
加載ra寄存器的值至x1寄存器 /
li t0, 0x00007800/
加載立即數(shù)0x00007800至t0(臨時寄存器) /
csrw mstatus, t0 /
將t0寄存器中的值寫入mstatus寄存器*/
LOAD a0, 2 * REGBYTES(sp)/* 加載保存的mstatus的值 /
csrs mstatus, a0/
將mstatus中與a0寄存器對應位為1的地方置0 /
LOAD x4, 4 * REGBYTES(sp) /
恢復整數(shù)寄存器 /
LOAD x5, 5 * REGBYTES(sp)
LOAD x6, 6 * REGBYTES(sp)
LOAD x7, 7 * REGBYTES(sp)
LOAD x8, 8 * REGBYTES(sp)
LOAD x9, 9 * REGBYTES(sp)
LOAD x10, 10 * REGBYTES(sp)
LOAD x11, 11 * REGBYTES(sp)
LOAD x12, 12 * REGBYTES(sp)
LOAD x13, 13 * REGBYTES(sp)
LOAD x14, 14 * REGBYTES(sp)
LOAD x15, 15 * REGBYTES(sp)
LOAD x16, 16 * REGBYTES(sp)
LOAD x17, 17 * REGBYTES(sp)
LOAD x18, 18 * REGBYTES(sp)
LOAD x19, 19 * REGBYTES(sp)
LOAD x20, 20 * REGBYTES(sp)
LOAD x21, 21 * REGBYTES(sp)
LOAD x22, 22 * REGBYTES(sp)
LOAD x23, 23 * REGBYTES(sp)
LOAD x24, 24 * REGBYTES(sp)
LOAD x25, 25 * REGBYTES(sp)
LOAD x26, 26 * REGBYTES(sp)
LOAD x27, 27 * REGBYTES(sp)
LOAD x28, 28 * REGBYTES(sp)
LOAD x29, 29 * REGBYTES(sp)
LOAD x30, 30 * REGBYTES(sp)
LOAD x31, 31 * REGBYTES(sp)
addi sp, sp, 32 * REGBYTES
#ifdef ARCH_RISCV_FPU
FLOAD f0, 0 * FREGBYTES(sp) /
恢復浮點寄存器 */
FLOAD f1, 1 * FREGBYTES(sp)
FLOAD f2, 2 * FREGBYTES(sp)
FLOAD f3, 3 * FREGBYTES(sp)
FLOAD f4, 4 * FREGBYTES(sp)
FLOAD f5, 5 * FREGBYTES(sp)
FLOAD f6, 6 * FREGBYTES(sp)
FLOAD f7, 7 * FREGBYTES(sp)
FLOAD f8, 8 * FREGBYTES(sp)
FLOAD f9, 9 * FREGBYTES(sp)
FLOAD f10, 10 * FREGBYTES(sp)
FLOAD f11, 11 * FREGBYTES(sp)
FLOAD f12, 12 * FREGBYTES(sp)
FLOAD f13, 13 * FREGBYTES(sp)
FLOAD f14, 14 * FREGBYTES(sp)
FLOAD f15, 15 * FREGBYTES(sp)
FLOAD f16, 16 * FREGBYTES(sp)
FLOAD f17, 17 * FREGBYTES(sp)
FLOAD f18, 18 * FREGBYTES(sp)
FLOAD f19, 19 * FREGBYTES(sp)
FLOAD f20, 20 * FREGBYTES(sp)
FLOAD f21, 21 * FREGBYTES(sp)
FLOAD f22, 22 * FREGBYTES(sp)
FLOAD f23, 23 * FREGBYTES(sp)
FLOAD f24, 24 * FREGBYTES(sp)
FLOAD f25, 25 * FREGBYTES(sp)
FLOAD f26, 26 * FREGBYTES(sp)
FLOAD f27, 27 * FREGBYTES(sp)
FLOAD f28, 28 * FREGBYTES(sp)
FLOAD f29, 29 * FREGBYTES(sp)
FLOAD f30, 30 * FREGBYTES(sp)
FLOAD f31, 31 * FREGBYTES(sp)
addi sp, sp, 32 * FREGBYTES
#endif
mret

線程與中斷間上下文切換

#include "cpuport.h"
.section .isr_vector, "ax"
.global irq_handler_trap
.align 2
irq_handler_trap: /* 中斷執(zhí)行過程中的上下文切換 /
#ifdef ARCH_RISCV_FPU
addi sp, sp, -32 * FREGBYTES /
從棧中開辟出空間 保存浮點寄存器 /
FSTORE f0, 0 * FREGBYTES(sp)
FSTORE f1, 1 * FREGBYTES(sp)
FSTORE f2, 2 * FREGBYTES(sp)
FSTORE f3, 3 * FREGBYTES(sp)
FSTORE f4, 4 * FREGBYTES(sp)
FSTORE f5, 5 * FREGBYTES(sp)
FSTORE f6, 6 * FREGBYTES(sp)
FSTORE f7, 7 * FREGBYTES(sp)
FSTORE f8, 8 * FREGBYTES(sp)
FSTORE f9, 9 * FREGBYTES(sp)
FSTORE f10, 10 * FREGBYTES(sp)
FSTORE f11, 11 * FREGBYTES(sp)
FSTORE f12, 12 * FREGBYTES(sp)
FSTORE f13, 13 * FREGBYTES(sp)
FSTORE f14, 14 * FREGBYTES(sp)
FSTORE f15, 15 * FREGBYTES(sp)
FSTORE f16, 16 * FREGBYTES(sp)
FSTORE f17, 17 * FREGBYTES(sp)
FSTORE f18, 18 * FREGBYTES(sp)
FSTORE f19, 19 * FREGBYTES(sp)
FSTORE f20, 20 * FREGBYTES(sp)
FSTORE f21, 21 * FREGBYTES(sp)
FSTORE f22, 22 * FREGBYTES(sp)
FSTORE f23, 23 * FREGBYTES(sp)
FSTORE f24, 24 * FREGBYTES(sp)
FSTORE f25, 25 * FREGBYTES(sp)
FSTORE f26, 26 * FREGBYTES(sp)
FSTORE f27, 27 * FREGBYTES(sp)
FSTORE f28, 28 * FREGBYTES(sp)
FSTORE f29, 29 * FREGBYTES(sp)
FSTORE f30, 30 * FREGBYTES(sp)
FSTORE f31, 31 * FREGBYTES(sp)
#endif
/
save all from thread context /
addi sp, sp, -32 * REGBYTES /
從棧中開辟出空間 保存整數(shù)寄存器 /
STORE x1, 1 * REGBYTES(sp) // ra
li t0, 0x80 /
將立即數(shù)0x10000000加載至t0寄存器 /
STORE t0, 2 * REGBYTES(sp) /
將t0寄存器的值保存至 from線程棧 /
STORE x4, 4 * REGBYTES(sp) // tp - thread pointer
STORE x5, 5 * REGBYTES(sp) // t0
STORE x6, 6 * REGBYTES(sp) // t1
STORE x7, 7 * REGBYTES(sp) // t2
STORE x8, 8 * REGBYTES(sp) // s0/fp
STORE x9, 9 * REGBYTES(sp) // s1
STORE x10, 10 * REGBYTES(sp) // a0
STORE x11, 11 * REGBYTES(sp) // a1
STORE x12, 12 * REGBYTES(sp) // a2
STORE x13, 13 * REGBYTES(sp) // a3
STORE x14, 14 * REGBYTES(sp) // a4
STORE x15, 15 * REGBYTES(sp) // a5
STORE x16, 16 * REGBYTES(sp) // a6
STORE x17, 17 * REGBYTES(sp) // a7
STORE x18, 18 * REGBYTES(sp) // s2
STORE x19, 19 * REGBYTES(sp) // s3
STORE x20, 20 * REGBYTES(sp) // s4
STORE x21, 21 * REGBYTES(sp) // s5
STORE x22, 22 * REGBYTES(sp) // s6
STORE x23, 23 * REGBYTES(sp) // s7
STORE x24, 24 * REGBYTES(sp) // s8
STORE x25, 25 * REGBYTES(sp) // s9
STORE x26, 26 * REGBYTES(sp) // s10
STORE x27, 27 * REGBYTES(sp) // s11
STORE x28, 28 * REGBYTES(sp) // t3
STORE x29, 29 * REGBYTES(sp) // t4
STORE x30, 30 * REGBYTES(sp) // t5
STORE x31, 31 * REGBYTES(sp) // t6
/
將sp寄存器的值保存值mscratch mscratch在機器模式下可快速交換數(shù)據(jù) /
csrw mscratch, sp
/
切換至中斷棧 /
la sp, _stack
/
進入中斷 /
call rt_interrupt_enter
/
將線程棧加載為入口參數(shù) 0*/
csrr a0, mscratch
call trap_entry /* 調用中斷處理函數(shù) /
call rt_interrupt_leave /
退出中斷 /
/
切換至線程棧 /
csrr sp, mscratch
/
判斷是否在中斷處理過程中觸發(fā)了調度 /
la s0, rt_thread_switch_interrupt_flag /
將rt_thread_switch_interrupt_flag的地址加載至s0 /
lw s2, 0(s0) /
將s0地址處的值加載至s2寄存器 /
beqz s2, spurious_interrupt /
判斷s2寄存器中的值是否為0 等于0則不進行線程棧的切換 /
/
clear switch interrupt flag /
sw zero, 0(s0) /
將s0寄存器的值清零 /
csrr a0, mepc /
將mepc的值保存至a0寄存器 /
STORE a0, 0 * REGBYTES(sp)/
將a0寄存器的值寫入線程棧中 /
la s0, rt_interrupt_from_thread/
將rt_interrupt_from_thread的地址加載至s0寄存器 /
LOAD s1, 0(s0)/
將from線程的線程棧加載至s1寄存器 /
STORE sp, 0(s1)/
將sp寄存器的值存儲至from線程棧 /
la s0, rt_interrupt_to_thread /
將rt_interrupt_to_thread的地址加載至s0寄存器 /
LOAD s1, 0(s0)/
將to線程的線程棧加載至s1寄存器 /
LOAD sp, 0(s1)/
將s1寄存器中的值加載至sp寄存器 /
LOAD a0, 0 * REGBYTES(sp) /
將to線程棧的pc加載至a0寄存器 /
csrw mepc, a0/
將a0寄存器的值寫入mepc寄存器 /
spurious_interrupt:
LOAD x1, 1 * REGBYTES(sp) // ra /
加載ra寄存器值至x1 /
/
Remain in M-mode after mret /
li t0, 0x00001800 /
加載立即數(shù)0x00001800至t0寄存器 /
csrs mstatus, t0 /
將t0寄存器中為1的位置與mstatus寄存器中對應的位置置1*/
LOAD t0, 2 * REGBYTES(sp) /* 加載保存的mstatus寄存器的值至t0*/
csrs mstatus, t0 /* 將t0寄存器中為1的位置與mstatus寄存器中對應的位置置1*/
LOAD x4, 4 * REGBYTES(sp) // tp /* 恢復整數(shù)寄存器值 /
LOAD x5, 5 * REGBYTES(sp) // t0
LOAD x6, 6 * REGBYTES(sp) // t1
LOAD x7, 7 * REGBYTES(sp) // t2
LOAD x8, 8 * REGBYTES(sp) // s0/fp
LOAD x9, 9 * REGBYTES(sp) // s1
LOAD x10, 10 * REGBYTES(sp) // a0
LOAD x11, 11 * REGBYTES(sp) // a1
LOAD x12, 12 * REGBYTES(sp) // a2
LOAD x13, 13 * REGBYTES(sp) // a3
LOAD x14, 14 * REGBYTES(sp) // a4
LOAD x15, 15 * REGBYTES(sp) // a5
LOAD x16, 16 * REGBYTES(sp) // a6
LOAD x17, 17 * REGBYTES(sp) // a7
LOAD x18, 18 * REGBYTES(sp) // s2
LOAD x19, 19 * REGBYTES(sp) // s3
LOAD x20, 20 * REGBYTES(sp) // s4
LOAD x21, 21 * REGBYTES(sp) // s5
LOAD x22, 22 * REGBYTES(sp) // s6
LOAD x23, 23 * REGBYTES(sp) // s7
LOAD x24, 24 * REGBYTES(sp) // s8
LOAD x25, 25 * REGBYTES(sp) // s9
LOAD x26, 26 * REGBYTES(sp) // s10
LOAD x27, 27 * REGBYTES(sp) // s11
LOAD x28, 28 * REGBYTES(sp) // t3
LOAD x29, 29 * REGBYTES(sp) // t4
LOAD x30, 30 * REGBYTES(sp) // t5
LOAD x31, 31 * REGBYTES(sp) // t6 /
恢復整數(shù)寄存器值結束 /
addi sp, sp, 32 * REGBYTES /
移動棧指針 /
#ifdef ARCH_RISCV_FPU
FLOAD f0, 0 * FREGBYTES(sp) /
恢復浮點寄存器值 /
FLOAD f1, 1 * FREGBYTES(sp)
FLOAD f2, 2 * FREGBYTES(sp)
FLOAD f3, 3 * FREGBYTES(sp)
FLOAD f4, 4 * FREGBYTES(sp)
FLOAD f5, 5 * FREGBYTES(sp)
FLOAD f6, 6 * FREGBYTES(sp)
FLOAD f7, 7 * FREGBYTES(sp)
FLOAD f8, 8 * FREGBYTES(sp)
FLOAD f9, 9 * FREGBYTES(sp)
FLOAD f10, 10 * FREGBYTES(sp)
FLOAD f11, 11 * FREGBYTES(sp)
FLOAD f12, 12 * FREGBYTES(sp)
FLOAD f13, 13 * FREGBYTES(sp)
FLOAD f14, 14 * FREGBYTES(sp)
FLOAD f15, 15 * FREGBYTES(sp)
FLOAD f16, 16 * FREGBYTES(sp)
FLOAD f17, 17 * FREGBYTES(sp)
FLOAD f18, 18 * FREGBYTES(sp)
FLOAD f19, 19 * FREGBYTES(sp)
FLOAD f20, 20 * FREGBYTES(sp)
FLOAD f21, 21 * FREGBYTES(sp)
FLOAD f22, 22 * FREGBYTES(sp)
FLOAD f23, 23 * FREGBYTES(sp)
FLOAD f24, 24 * FREGBYTES(sp)
FLOAD f25, 25 * FREGBYTES(sp)
FLOAD f26, 26 * FREGBYTES(sp)
FLOAD f27, 27 * FREGBYTES(sp)
FLOAD f28, 28 * FREGBYTES(sp)
FLOAD f29, 29 * FREGBYTES(sp)
FLOAD f30, 30 * FREGBYTES(sp)
FLOAD f31, 31 * FREGBYTES(sp) /
恢復浮點寄存器值結束 /
addi sp, sp, 32 * FREGBYTES /
移動棧指針 */
#endif
mret


聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權轉載。文章觀點僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場。文章及其配圖僅供工程師學習之用,如有內(nèi)容侵權或者其他違規(guī)問題,請聯(lián)系本站處理。 舉報投訴
  • 寄存器
    +關注

    關注

    31

    文章

    5253

    瀏覽量

    119209
  • 中斷處理
    +關注

    關注

    0

    文章

    94

    瀏覽量

    10933
  • RT-Thread
    +關注

    關注

    31

    文章

    1239

    瀏覽量

    39441
  • RISC-V
    +關注

    關注

    44

    文章

    2141

    瀏覽量

    45712
收藏 人收藏

    評論

    相關推薦

    請問risc-v中斷還需要軟件保存上下文和恢復嗎?

    risc-v中斷還需要軟件保存上下文和恢復嗎?
    發(fā)表于 02-26 07:40

    編寫一個任務調度程序,在上下文切換后遇到了一些問題求解

    大家好, 我正在編寫一個任務調度程序,在上下文切換后遇到了一些問題。 為下一個任務恢復上下文后: __builtin_tricore_mtcr_by_name(\"pcxi\"
    發(fā)表于 05-22 07:50

    BT堆棧上下文切換

    100ms就會產(chǎn)生一個上下文切換上下文切換每秒似乎有點高。我想我真的不能抱怨10個開關,但是有什么東西嗎?在BT協(xié)議中真的需要這個嗎?不能處理中斷驅動嗎?(這是BT是可連接的,但既沒有連接,也沒有
    發(fā)表于 12-17 16:30

    上下文切換簡介

    處理系統(tǒng)中,CPU需要處理所有程序的操作,當用戶來回切換它們時,需要記錄這些程序執(zhí)行到哪里。上下文切換就是這樣一個過程,他允許CPU記錄并恢復各種正在運行程序的狀態(tài),使它能夠完成切換操作。
    發(fā)表于 08-06 08:08

    上下文切換的情況發(fā)生

    處理系統(tǒng)中,CPU需要處理所有程序的操作,當用戶來回切換它們時,需要記錄這些程序執(zhí)行到哪里。上下文切換就是這樣一個過程,他允許CPU記錄并恢復各種正在運行程序的狀態(tài),使它能夠完成切換操作。
    發(fā)表于 08-07 08:38

    如何實現(xiàn)一個RISC-V內(nèi)核架構的芯片移植工作

    上下文切換一般在 CM3 等架構下,我們習慣在任務切換函數(shù)中,觸發(fā) PendSV 中斷,然后在 PendSV 處理函數(shù)中實現(xiàn)上下文切換,在 RISC-V 架構中,可以使用 Softwa
    發(fā)表于 03-25 10:11

    基于cortex-m3的rt-thread系統(tǒng)如何實現(xiàn)線程上下文切換

    線程上下文切換等功能,一般采用匯編格式編寫,不同cpu架構實現(xiàn)方式肯定不同,為了使rt-thread系統(tǒng)能夠在不同的CPU架構上都能運行,RT-thread提供了一套libcpu抽象層來適配
    發(fā)表于 05-05 15:00

    RISC-V上下文切換匯編代碼注釋簡析

    線程與線程間上下文切換/*Copyright (c) 2006-2018, RT-Thread Development TeamSPDX-License-Identifier
    發(fā)表于 02-13 15:12

    討論ARM mbed OS(RTX) 的上下文切換

    意義。而且因為 ARM 沒有歷史包袱,相較于 x86 架構,其設計非常的 make sense,更加符合現(xiàn)代操作系統(tǒng)實現(xiàn)的直覺,尤其是 v7a。所以如果上下文切換本身是跳不過去的環(huán)節(jié)的話,基于 ARM
    發(fā)表于 02-16 14:26

    rt-thread上下文切換函數(shù)的意義在哪?

    Cortex-M3內(nèi)核上下文切換函數(shù)rt_hw_context_switch()/ rt_hw_context_switch_interrupt()中有個判斷rt_thread_switch_interrupt_flag的地方,不知道意義在哪?
    發(fā)表于 03-10 11:28

    中斷中的上下文切換詳解

    任務上下文切換的訴求?! 槭裁丛谥袛喾蘸瘮?shù)中會產(chǎn)生任務上下文切換的訴求?因為中斷中可能會進行信號量post之類的動作(這可能會觸發(fā)此前一直處于pend狀態(tài)的,且比當前被中斷打斷的任務優(yōu)先級更高的任務
    發(fā)表于 03-23 17:18

    CPU上下文切換的詳細資料講解

    當UCOS-III轉向執(zhí)行另一項新任務的時候,他保存了當前任務的CPU寄存器到堆棧,并從新任務的堆棧CPU寄存器載入CPU,這個過程叫做上下文切換
    發(fā)表于 08-16 17:31 ?2次下載
    CPU<b class='flag-5'>上下文切換</b>的詳細資料講解

    如何分析Linux CPU上下文切換問題

    在我的上一篇文章:《探討 Linux CPU 的上下文切換》中,我談到了 CPU 上下文切換的工作原理。快速回顧一下,CPU 上下文切換是保證 Linux 系統(tǒng)正常運行的核心功能。可分為進程
    的頭像 發(fā)表于 05-05 20:11 ?1836次閱讀

    Linux技術:什么是cpu上下文切換

    過多的上下文切換會消耗 CPU 的時間來保存和恢復寄存器、程序計數(shù)器、內(nèi)核棧和虛擬內(nèi)存等數(shù)據(jù),從而導致系統(tǒng)性能顯著下降。 既然上下文切換對系統(tǒng)性能的影響如此之大,那么我們?nèi)绾螜z查它呢?好了,你可以使用 vmstat 工具來查詢你系統(tǒng)的
    發(fā)表于 09-01 09:31 ?345次閱讀
    Linux技術:什么是cpu<b class='flag-5'>上下文切換</b>

    FreeRTOS系列技術文章:上下文切換

    嵌入式實時操作系統(tǒng)(RTOS)中的上下文切換是指保存和恢復任務的狀態(tài),以使調度程序能夠切換到另一個任務,從而促進多任務處理。
    的頭像 發(fā)表于 11-21 15:48 ?906次閱讀