RISCV基础开发(九)

gewenbin
gewenbin
gewenbin
188
文章
15
评论
2021年8月21日10:26:35 评论 1,113

QEMU裸机开发之M模式核间中断

QEMU的virt平台基本是参考SIFIVE的U540平台设计的,所以其寄存器大部分都和U540中的一样,我们再来看下CLINT中定义的核间中断设置寄存器,如下所示。

RISCV基础开发(九)

每个寄存器都是4字节大小,由于我们当前只使用了一个核,所以我们只需要操作第一个“msip”寄存器即可。这个寄存器只有bit0有效,置1触发核间中断,置0取消核间中断。定义“clint.c”,对这两个操作封装相应的函数,如下所示。

#include "address.h"

// core local interruptor (CLINT), which contains the timer.
#define CLINT_MSIP             (CLINT_REG_BASE + 0x0)

void msoftint_make(void)
{
    *(volatile unsigned int*)CLINT_MSIP = 1;
}

void msoftint_clear(void)
{
    *(volatile unsigned int*)CLINT_MSIP = 0;
}

随后在“start”中添加触发核间中断的代码,如下所示。

void start(void)
{
    printf("%s %d.\r\n", __func__, __LINE__);

    machine_trap_init();

    msoftint_make();
}

在“trap.c”中添加取消核间中断的代码,不然会一直产生中断,如下所示。

void machine_trap(void)
{ 
    printf("%s %d.\r\n", __func__, __LINE__);
    
    msoftint_clear();
}

在命令行执行“make qemu”,可以在最后看到打印的函数名以及行号信息,如下所示。

gewenbin@gewenbin-virtual-machine:~/Desktop/qemu_test/lesson4$ make qemu
riscv64-unknown-elf-gcc    -c -o entry.o entry.S
riscv64-unknown-elf-gcc -Wall -Werror -O -fno-omit-frame-pointer -ggdb -mcmodel=medany -ffreestanding -fno-common -nostdlib -mno-relax -I. -fno-stack-protector -fno-pie -no-pie   -c -o start.o start.c
riscv64-unknown-elf-gcc -Wall -Werror -O -fno-omit-frame-pointer -ggdb -mcmodel=medany -ffreestanding -fno-common -nostdlib -mno-relax -I. -fno-stack-protector -fno-pie -no-pie   -c -o uart.o uart.c
riscv64-unknown-elf-gcc -Wall -Werror -O -fno-omit-frame-pointer -ggdb -mcmodel=medany -ffreestanding -fno-common -nostdlib -mno-relax -I. -fno-stack-protector -fno-pie -no-pie   -c -o trap.o trap.c
riscv64-unknown-elf-gcc -Wall -Werror -O -fno-omit-frame-pointer -ggdb -mcmodel=medany -ffreestanding -fno-common -nostdlib -mno-relax -I. -fno-stack-protector -fno-pie -no-pie   -c -o clint.o clint.c
riscv64-unknown-elf-ld -z max-page-size=4096 -T kernel.ld -o kernelimage entry.o start.o uart.o trap.o clint.o 
riscv64-unknown-elf-objdump -S kernelimage > kernel.asm
riscv64-unknown-elf-objdump -t kernelimage | sed '1,/SYMBOL TABLE/d; s/ .* / /; /^$/d' > kernel.sym
qemu-system-riscv64 -machine virt -bios none -kernel kernelimage -m 128M -smp 1 -nographic
start 28.
machine_trap 7.

工程源码:链接:https://pan.baidu.com/s/1TnTYr7mywdKj5bxpdmWnyA,提取码:q772,见lesson4。

gewenbin
  • 本文由 发表于 2021年8月21日10:26:35
  • 转载请务必保留本文链接:http://www.databusworld.cn/10528.html
匿名

发表评论

匿名网友 填写信息

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen: