小编Dox*_*ver的帖子

用于ARM的gcc - 移动代码和堆栈

我正在开发一个ARM Cortex-M3(SiLabs)SOC项目.我需要将中断向量[编辑]和代码从闪存底部移开,为"引导加载程序"腾出空间.当核心复位时,引导加载程序从地址0开始出现.它的功能是验证主图像,加载到更高的地址,并可能用新图像替换主图像.

因此,引导加载程序的向量表将为0,后跟其代码.在更高的固定地址(例如8KB)将是主要图像,从其向量表开始.

我找到了这个页面,它描述了引导加载程序可以使用的向量表偏移寄存器(显然屏蔽了中断)将硬件指向新的向量表.

我的问题是如何将"主"图像链接起来,以便在写入闪存时起作用,从零开始.我不熟悉ARM程序集,但我认为代码不是位置独立的.

我正在使用SiLabs的Precision32 IDE,它使用gcc作为工具链.我发现了如何添加链接器标志.我的问题是gcc标志将提供对向量表和代码的基础的更改.

谢谢.

linker gcc arm cortex-m3

4
推荐指数
1
解决办法
3735
查看次数

子进程中的变量修改

我正在研究科比和奥哈拉伦的作品Computer Systems, A Programmer's Perspective。练习 8.16 要求程序的输出如下(我更改了它,因为他们使用了一个你可以在他们的网站上下载的头文件):

#include <stdio.h>
#include <stdlib.h>
#include <sys/types.h>
#include <sys/wait.h>
#include <errno.h>
#include <unistd.h>
#include <string.h>
int counter = 1;

int main()
{
    if (fork() == 0){
        counter--;
        exit(0);
    }

    else{
        Wait(NULL);
        printf("counter = %d\n", ++counter);
    }
    exit(0);
}
Run Code Online (Sandbox Code Playgroud)

我回答“counter = 1”,因为父进程等待其子进程终止,然后递增计数器。但孩子首先递减它。然而,当我测试该程序时,我发现正确的答案是“counter = 2”。变量“counter”在子进程和父进程中是否不同?如果不是,那为什么答案是2?

c fork process waitpid

3
推荐指数
1
解决办法
735
查看次数

标签 统计

arm ×1

c ×1

cortex-m3 ×1

fork ×1

gcc ×1

linker ×1

process ×1

waitpid ×1