小编Dav*_*tag的帖子

了解 ARM Cortex-M0+ 重定位

我刚刚开始进行嵌入式 arm 开发,有一段代码真的让我很烦恼:

/* Initialize the relocate segment */
pSrc = &_etext;
pDest = &_srelocate;

if (pSrc != pDest) 
{
    while (pDest < &_erelocate) 
    {
        *pDest++ = *pSrc++;
    }
}
Run Code Online (Sandbox Code Playgroud)

其中_etext_srelocate是链接描述文件中定义的符号:

. = ALIGN(4);
_etext = .;

.relocate : AT (_etext)
{
    . = ALIGN(4);
    _srelocate = .;
    *(.ramfunc .ramfunc.*);
    *(.data .data.*);
    . = ALIGN(4);
    _erelocate = .;
} > ram
Run Code Online (Sandbox Code Playgroud)

哪里ram是原点为 的内存段0x20000000。我看到的问题是,这_etext是一个标记.text段结束边界的符号,它是不同内存段的一部分rom。这意味着除非上述内存段 100% 已满,_etext …

arm relocation

5
推荐指数
1
解决办法
557
查看次数

std :: future <both ::无论是<int,std :: string >>分段错误

此问题中的代码使用Either<>此处的实现:https://github.com/LoopPerfect/neither.为了清楚起见,我怀疑这是一个特定库的问题,否则我会在那里创建一个问题.

以下代码段按预期工作:

std::future<std::string> f = std::async(std::launch::async, []()
{
    return "test";
}

std::cout << f.get() << std::endl;
Run Code Online (Sandbox Code Playgroud)

以下生成分段错误:

std::future<neither::Either<int, std::string>> f = std::async(std::launch::async, []()
{
    return neither::Either<int, std::string>(neither::right(std::string("test")));
});

neither::Either<int, std::string> v = f.get(); // Segmentation fault
std::cout << v.right().value << std::endl;
Run Code Online (Sandbox Code Playgroud)

返回left(-1)作品一样,neither::Either<int, int>两个left()right().我知道std::future::get可能会产生一个段错误就是你已经调用了两次,在这种情况下,它std::future::valid会在调用之前返回false get,但valid返回true.

这里有什么我想念的吗?

c++ either c++14

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

标签 统计

arm ×1

c++ ×1

c++14 ×1

either ×1

relocation ×1