小编Evi*_*Pie的帖子

GCC错误"<variable>导致节类型冲突"

为什么在尝试将两个(RAM)变量(只是它们的初始化值不同)放入同一部分时会出现编译器错误?

问题

C源:

int __attribute__((section(".in_my_data"))) _foo = 1;
int __attribute__((section(".in_my_data"))) _bar = 0;
Run Code Online (Sandbox Code Playgroud)

(相关)GCC编译器输出:

mcve/main.c:75:45: error: _bar causes a section type conflict
Run Code Online (Sandbox Code Playgroud)

链接器脚本在SECTIONS定义中包含以下行,但(致命)错误来自编译器,而不是链接器.

.my_data : { *(.in_my_data) } > data
Run Code Online (Sandbox Code Playgroud)

更多的信息

更改C源以允许编译器使用两个部分允许编译通过,但是如果两个输入节被映射到相同的输出节,则链接器会生成错误.

C源:

int __attribute__((section(".in_my_data_nonzero"))) _foo = 1;
int __attribute__((section(".in_my_data_zero"))) _bar = 0;
Run Code Online (Sandbox Code Playgroud)

链接描述文件:

.my_data : { *(.in_my_data*) } > data
Run Code Online (Sandbox Code Playgroud)

(相关)链接器输出:

Link Error: attributes for input section '.in_my_data_nonzero' conflict
with output section '.my_data'
Run Code Online (Sandbox Code Playgroud)

交换C源代码行的顺序只会改变哪个部分(第二个出现在C源代码中)是错误的.

对于初始化为零的变量,GCC编译器需要哪些属性,而不是那些用非零初始化的变量,反之亦然?

编译器是否尝试将初始化的变量放在.bss部分中,而不是.data初始化数据部分?或者是否有另一部分数据初始化为零?

相关问题

类似的问题似乎涵盖了内存类型(ROM与RAM)之间冲突的问题:

...或将初始化 …

c gcc xc16

7
推荐指数
2
解决办法
5813
查看次数

欺骗将常数(2的幂)除以整数

注意这是一个理论问题.我很满意我的实际代码的性能.我只是想知道是否有其他选择.

是否有一个技巧可以通过整数变量值对一个常量值进行整数除法,该整数除法本身就是2的整数次幂,而不必使用实际的除法运算?

// The fixed value of the numerator
#define SIGNAL_PULSE_COUNT 0x4000UL

// The division that could use a neat trick.
uint32_t signalToReferenceRatio(uint32_t referenceCount)
{
    // Promote the numerator to a 64 bit value, shift it left by 32 so
    // the result has an adequate number of bits of precision, and divide
    // by the numerator.
    return (uint32_t)((((uint64_t)SIGNAL_PULSE_COUNT) << 32) / referenceCount);
}
Run Code Online (Sandbox Code Playgroud)

我找到了几个(很多)参考,用于通过常量,整数和浮点进行除法的技巧.例如,问题什么是将整数除以3的最快方法?有很多好的答案,包括参考其他学术和社区材料.

鉴于分子是常数,并且它是2的整数幂,是否有一个巧妙的技巧可以用来代替实际的64位除法; 某种逐位操作(移位,AND,XOR,那种东西)或类似的操作?

由于仪器的精度取决于此测量的精度,因此我不希望任何精度损失(超出可能由于整数舍入导致的半位)大于实际除法的精度.

"让编译器决定"不是答案,因为我想知道是否有诀窍.

额外的,上下文信息

我正在开发一个16位数据,24位指令字微控制器的驱动程序.驱动器对外围模块做了一些魔术,以获得信号频率的固定数量脉冲的参考频率的脉冲计数.所需结果是信号脉冲与参考脉冲的比率,表示为无符号32位值.该函数的算法由我正在为其开发驱动程序的设备的制造商定义,并且结果被进一步处理以获得浮点实际值,但这超出了该问题的范围.

我正在使用的微控制器有一个数字信号处理器,它有许多我可以使用的除法操作,如果有必要,我不害怕这样做.会有这种方法克服,超越放在一起汇编指令,使其工作,如DSP被用来做一个BLDC驱动ISR一个PID功能一些小的挑战,但没有什么我不能管理.

c theory optimization integer-arithmetic

6
推荐指数
1
解决办法
820
查看次数

如何将参数引用到XML文档中的其他方法?

我的代码包含一个带有一个方法的类,该方法返回一个最初作为参数传递给另一个方法的对象.我想在XML文档标记中指出这种关系.

class XmlDocThing
{
    /// <summary>
    /// Documentation for the other method.
    /// </summary>
    /// <param name="howDoIReferToThis">Magic object.</param>
    public void AnotherMethod(object howDoIReferToThis) { }

    /// <summary>
    /// Documentation for this method.
    /// </summary>
    /// <returns>The object passed as the <paramref name="howDoIReferToThis"/>
    /// argument of the <see cref="AnotherMethod"/> method.</returns>
    public object FromThisMethod() { return null; }
}
Run Code Online (Sandbox Code Playgroud)

这导致警告:

警告1对"MyNamespace.XmlDocThing.FromThisMethod()"的XML注释具有"howDoIReferToThis"的paramref标记,但该名称没有参数

<see cref="AnotherMethod"/>执行方法引用的元素按预期工作,但<paramref>似乎没有cref属性(似乎只适用于方法和属性成员)或任何等效项.

这是否可能,如果是这样,怎么样?

xml-documentation

5
推荐指数
0
解决办法
108
查看次数

适用于CANopen和Modbus的EDS

我正在开发的设备必须支持CANopen和Modbus(RTU和TCP)通信。是否有任何电子数据表格式(例如EDS或XDD)可用于定义两者?

我尝试使用几个工具(Vector CANeds和ODVA EZ-EDS)来生成一个与两者兼容的简单EDS文件,甚至依靠在文本编辑器中手动编辑文件,但是每个文件的输出看起来都差不多,但是彼此根本不相容。

理想情况下,我想使用CiA XDD格式,因为从我的桌面主应用程序中“反序列化”相对来说比较简单。但是,这似乎完全面向CANopen。

任何人都可以提供的任何信息,提示,技巧或指示,将不胜感激。

modbus canopen opc

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

避免在多线程 c# MVVM 应用程序中从 ViewModel 对象调用 BeginInvoke()

我的 C# 应用程序有一个数据提供程序组件,它在自己的线程中异步更新。ViewModel 类都继承自一个实现INotifyPropertyChanged. 为了让异步数据提供者使用 PropertyChanged 事件更新视图中的属性,我发现我的 ViewModel 与视图非常紧密地结合在一起,因为只需要从 GUI 线程中引发事件!

#region INotifyPropertyChanged

/// <summary>
/// Raised when a property on this object has a new value.
/// </summary>
public event PropertyChangedEventHandler PropertyChanged;

/// <summary>
/// Raises this object's PropertyChanged event.
/// </summary>
/// <param name="propertyName">The property that has a new value.</param>
protected void OnPropertyChanged(String propertyName)
{
    PropertyChangedEventHandler RaisePropertyChangedEvent = PropertyChanged;
    if (RaisePropertyChangedEvent!= null)
    {
        var propertyChangedEventArgs = new PropertyChangedEventArgs(propertyName);

        // This event has to be raised on …
Run Code Online (Sandbox Code Playgroud)

c# wpf multithreading mvvm

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

C是否提供了一种将外部变量声明为"只读"的方法,但是将其定义为可写?

我正在使用GCC C为嵌入式产品开发硬件抽象库.在库中,有一个变量应该对链接库的应用程序是只读的,但可以在定义它的编译单元中进行修改.

是否有一种标准的,可接受的方式来声明允许应用程序读取变量中的值的整数(在库头文件中),但是如果尝试生成写回写的代码,则告诉编译器生成错误对吗?例如,如果我要将函数声明为:

extern void foo(int const bar);
Run Code Online (Sandbox Code Playgroud)

...然后允许调用者传递局部变量:

int bar = 0;
foo(bar);
Run Code Online (Sandbox Code Playgroud)

...但是如果函数声明尝试写入bar:

void foo(int const bar)
{
    bar = 99;
}
Run Code Online (Sandbox Code Playgroud)

...然后编译器会报告错误:分配只读位置"bar".

放置const名称之前的语法似乎不会以与函数参数相同的方式应用于变量,并且下面的两行似乎实际上是等效的:

extern const int x;
extern int const y;
Run Code Online (Sandbox Code Playgroud)

...因为将y定义为int y;导致错误:'y'的冲突类型限定符,正如我所期望的那样,x被定义为int x;.

我知道我可以通过声明和定义一个返回值的访问器函数(它只能用作r值)来解决这个问题.

我在这里已经阅读了许多相关的问题,但是我找到的没有一个为C提供了明确的答案(而不是C++或C#):

C - 通过const声明访问非const

混合extern和const

有人可以指出我如何实现它的一个例子的方向,或者证实我怀疑它在语法上是不可实现的吗?

c embedded const declaration extern

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