我想编写我的代码来处理Microblaze上的TLB未命中,当然还有页面表等.这些都是在OVPsim上完成的.
在我学习的过程中,我编写了这个小程序集以引用未映射的位置(0x1000000) - 我将此作为特权代码运行,其中VM为:
ori r20, r0, 0
ori r12, r0, 0x1000000
/* next line should break it */
sw r20, r12, r0
Run Code Online (Sandbox Code Playgroud)
(即,将内容写入r20 == 0ORing形成的地址r12 == 0x1000000,r0 == 0 => 0x1000000显然.)
但是,GDB没有跳转到异常向量,而是报告"程序收到SIGSEV" - 我出错了什么?我没有在MSR中启用硬件异常位,但是手册说你无法在任何情况下掩盖这些异常,所以这不应该是问题.
进一步的信息我不能得到任何(例如,包括错位异常)要执行的异常处理代码,(除非我明确地调用它),无论我是否使用调试器.关闭调试器后,我从OVPsim得到这个输出(NB我只是改变了测试地址 - 上面的0xA000000和0x100000之间没有区别):
Processor Exception (PC_PRX) Processor 'platform/cpu0' 0x248: sw r20, r12, r0
Processor Exception (PC_WPX) No write access at 0xa000000
Run Code Online (Sandbox Code Playgroud)
这是所有代码都以特权模式运行,所以除非我没有正确配置Microblaze ,否则我没有看到它没有调用处理程序的明显原因.我打开了这些:
icmAddStringAttr(cpu1_attr, "endian", "big");
icmAddDoubleAttr(cpu1_attr, "mips", 100.000000);
icmAddStringAttr(cpu1_attr, "variant", "V8_20");
icmAddBoolAttr(cpu1_attr, "verbose", …Run Code Online (Sandbox Code Playgroud) 作为小型C程序中具有全局范围的代码,我有:
FILE *outFile = stdout;
Run Code Online (Sandbox Code Playgroud)
这是因为我希望将stdout输出作为默认目的地,但允许用户在命令行中指定不同的目的地(虽然我知道他们可以重定向我想要腰带和大括号).
这无法编译:
xmlheap.c:15:17: error: initializer element is not a compile-time constant
FILE *outFile = stdout;
^~~~~~
/usr/include/stdio.h:215:16: note: expanded from macro 'stdout'
#define stdout __stdoutp
Run Code Online (Sandbox Code Playgroud)
这不可能吗?
我有一个使用 CMake 的项目,并在 Windows 上的一组深度嵌套的目录中构建,通常会由于路径长度过长而失败。
基于这个答案 - How to set the Maximum Path Length with CMAKE? - (以及下面@Tsyvarev 的评论 - CMake 的最大路径长度- 我将其放在项目根目录中的 CMakeLists.txt 中并靠近文件顶部(即在任何其他处理之前):
set(CMAKE_OBJECT_PATH_MAX 250)
set(CMAKE_OBJECT_NAME_MAX 245)
Run Code Online (Sandbox Code Playgroud)
(由于构建始终在 Windows 上进行,因此我没有在之前问题的答案中考虑 Unix 测试。)
然而,它仍然失败。
我有其他机制来缩短路径长度,所以我知道这是这里的问题 - 但我正在寻找一般建议,向用户提供有关如何设置 CMake 构建以确保他们避免此问题的建议 - 我的理解是CMake 将使用哈希方案来避免长路径名,但这似乎没有发生。
那么这样的机制是否存在,如果存在我该如何访问它呢?
我正在从文件中读取二进制数据:
char* buffIn = new char[8];
ifstream inFile(path, ifstream::binary);
inFile.read(buffIn, 8);
Run Code Online (Sandbox Code Playgroud)
然后,我想将读取的char *(以二进制形式)转换为无符号长整数,但是我遇到了问题-我不太确定发生了什么,但是例如0x00000000000ACD被解释为0xFFFFFFFFFFFFCD-我怀疑所有0x00字节都是从char *转换为unsigned long时引起某种问题...
unsigned long number = *(buffIn);
Run Code Online (Sandbox Code Playgroud)
如何正确执行此操作?
我正在尝试将一些 Forth 加载到我在 RISC-V SBC 上运行的 Forth 编译器中(不过我不相信这是一个与 Forth 相关的问题):
>load /root/repos/riscyforth/test2.4th
: cuboid * * [ The cuboid has a volume of ] . ;
OK
cuboid
Program received signal SIGILL, Illegal instruction.
0x0000003ff7dbd038 in ?? ()
Run Code Online (Sandbox Code Playgroud)
上面显示的是我用 Forth 加载文件,第一行,回显到终端,是 cuboid 这个词的定义。随后的 OK 说明 Forth 编译器已经成功编译了这个词。
然后第二行是这个词的调用,长方体,然后是程序(在这种情况下在 GDB 下运行)已经用 SIGILL 兑现的消息。
但是,这是反汇编显示的内容:
(gdb) disassemble 0x3ff7dbd038, 0x3ff7dbd078
Dump of assembler code from 0x3ff7dbd038 to 0x3ff7dbd078:
=> 0x0000003ff7dbd038: addi s9,s9,-8
0x0000003ff7dbd03c: sd s7,0(s9)
0x0000003ff7dbd040: li s8,63
0x0000003ff7dbd044: slli s8,s8,0x20
0x0000003ff7dbd048: lui …Run Code Online (Sandbox Code Playgroud) 回到几年前我写的一些C代码,我觉得它应该是泄漏记忆,但我找不到它的迹象,我想检查我的假设.
我有这样的结构:
struct BitArray {
....
char *bits;
....
}
Run Code Online (Sandbox Code Playgroud)
bits 动态分配如下:
bArray->bits = (char *)calloc(1, 1 << shiftNumber);
Run Code Online (Sandbox Code Playgroud)
和free-ed像这样:
free(nextBA->bits);
Run Code Online (Sandbox Code Playgroud)
但不应把漏内存-也就是说,它只会free在最初的char那bits点?free以这种方式分配内存的正确方法是什么?
在BASIC中,print语句可能如下所示:
100 PRINT "Copyright, Adrian McMenamin","maybe"
Run Code Online (Sandbox Code Playgroud)
哪个应该在第一个语句和第二个语句之间放置一个制表符空格.
我正在为Groovy/Java中的BASIC开发DSL /解释器,需要解析这一行并生成如下内容:
print "Copyright, Adrian McMenamin", " ","maybe"
Run Code Online (Sandbox Code Playgroud)
(因为Groovy将逗号解释为仅分离打印函数的参数.)
那么正则表达式将区分不在引号内的逗号和那些(不要担心PRINT或行号等)的逗号?