小编FRo*_*Rob的帖子

git-subtree拉合并冲突

所以我使用git-subtree在repoA的子目录中拥有repoB的各种分支,就像这样

git clone repoA
cd repoA
// some commits to repoA here
git subtree add --prefix=src/dirA repoB branchA
Run Code Online (Sandbox Code Playgroud)

我在repoA中使用了一些提交

git subtree push --prefix=src/dirA repoB branchA
Run Code Online (Sandbox Code Playgroud)

一段时间后,我从另一个repoC中提交了一些repoB/branchA,其中branchA也是使用git-subtree添加的.

现在,我试试

git subtree pull --prefix=src/dirA repoB branchA
Run Code Online (Sandbox Code Playgroud)

但是,我没有明显的理由得到合并冲突.这些变化很简单,根本没有冲突 - 正如补丁所证实的那样.

我不确定如何解决这个错误.我已经找到了另外四个处理相同/类似问题的线程:

  1. git-subtree拉动并发症
  2. git subree pull -P无论<repo> <ref>总是合并冲突
  3. 从中央回购中拉出git-subtree冲突
  4. 合并一个简单的上游更改时,Git子树合并报告会发生冲突(这一点与子树合并策略有关,见下文)

我不确定这与不同的SHA-1有关,因为我没有重新提交我的提交,也没有编辑它们; 链接1到3.

我的问题更像是链接4,其中git奇怪地无法进行简单的合并.但是,链接3讨论了子树合并策略,特别是git-subtree,所以我不确定这在我的情况下是否适用.

虽然情况看起来是一样的:

<<<<<<< HEAD
=======
// changes from commit I try to pull from repoB/branchA
>>>>>>> {commit SHA-1 from commit I try to pull from repoB/branchA}
Run Code Online (Sandbox Code Playgroud)

所以我注意到BASE在三向合并窗口(kdiff3)中显然是错误的.但是,如果是这种情况,为什么git尝试不应用所有早期的提交?发行

git log --oneline …
Run Code Online (Sandbox Code Playgroud)

git git-subtree

15
推荐指数
2
解决办法
5610
查看次数

条件编译取决于函数参数?

我搜索的范围很广,网上的信息似乎暗示使用预处理器的条件编译仅适用于环境变量.

基本上,我希望内联函数或宏基于其输入参数执行不同的操作.我想要实现的例子:

inline void foo(int x) {

    #if (x < 32)

        register0 |= (1 << x);

    #else

        register1 |= (1 << (x - 32));

    #endif

}
Run Code Online (Sandbox Code Playgroud)

这里的主要目标是生成的内联代码不包含常量输入的条件代码.

基本上,我目前正在为一个微控制器(lpc213x)编程,并希望有一个内联函数或宏来进行引脚配置设置.由于引脚配置分为多个寄存器(例如上面的0和1),我想执行一些条件检查以确定应该为给定的引脚常数写入哪个寄存器.

但是,引脚配置在编译时都是常量,所以我想从编译代码中消除条件检查.我知道无论如何优化都可能摆脱不必要的条件,但我想知道是否有办法明确地实现这种行为,因为我可能需要在将来禁用优化.

谢谢,

FROB

c c-preprocessor

5
推荐指数
2
解决办法
849
查看次数

ModelSim 消息查看器为空

我目前正在使用 Modelsim 10.1 和 ISE 13.4 并运行一个非常简单的测试平台。所有代码都是VHDL。

assert几天我在使用 VHDL 的声明时遇到了麻烦:错误和警告被输出到抄本。但是,消息查看器中没有消息,波形窗口中也没有消息指示器。如果这很重要,我会从 ISE 内部开始我的模拟。

我想我可能缺少一个开关来打开消息记录或其他东西,但数小时的谷歌搜索没有带来任何东西。是否有任何设置会阻止消息被记录到消息查看器,尽管它会被打印到脚本中?

我已经找到了Simulate->Runtime Options-->Message Severity。但是,那里的一切都未经检查。勾选任何复选框会产生不打印到抄本的预期行为,但消息查看器中仍然没有任何消息的迹象。

谢谢你的时间,

罗伯特

编辑:

好吧,经过一番折腾,终于找到了。

必须将msgmodedisplaymsgmode选项设置为至少both具有良好的消息指示器。这似乎是在我公司早期 ModelSim 版本的默认配置中完成的。

我希望像我这样无知的人发现这个答案有帮助:)

message viewer vhdl modelsim

5
推荐指数
2
解决办法
4961
查看次数

最佳常见做法 I2C 寄存器映射

只是想知道关于 C 中 I²C 寄存器映射的最佳实践是什么,或者其他人经常/更喜欢使用什么。

到目前为止,我通常做了很多定义,一个用于每个寄存器,一个用于所有位、掩码、移位等。然而,最近我看到一些驱动程序使用(可能是打包的)结构而不是定义。我认为这些是 Linux 内核模块。

反正他们会

struct i2c_sensor_fuu_registers {

    uint8_t  id;
    uint16_t big_register;
    uint8_t  another_register;
    ...

} __attribute__((packed));
Run Code Online (Sandbox Code Playgroud)

然后他们会使用 offsetof(或宏)来获取 i2c 寄存器并使用 sizeof 来读取要读取的字节数。

我发现这两种方法都有其优点:

结构方法:

  • (+) 寄存器偏移量都在逻辑上包含在结构中,而不必在定义中拼写每个寄存器。
  • (+) 条目大小使用适当大小的数据类型明确说明。
  • (-) 这不包括广泛使用的位域
  • (-) 这不考虑非字节映射的寄存器映射(例如 LM75),其中从偏移 n+0x00 读取 2 个字节,但 n+0x01 是另一个寄存器,而不是寄存器 n 的高/低字节+0x00
  • (-) 这并没有考虑到地址空间中的大间隙(例如 0x00、0x01、0x80、0xAA 处的寄存器,没有中间......)并且(我认为?)依赖编译器优化来摆脱结构.

定义方法:

  • (+) 每个寄存器及其位通常定义在一个块中,这使得找到正确的符号变得容易并依赖于命名约定。
  • (+) 透明/不知道地址空间差距。
  • (-) 每个寄存器都必须单独定义,即使没有间隙
  • (-) 因为定义往往是全局的,所以名称通常很长,用几十个长符号名称在源代码中有点乱七八糟。
  • (-) 要读取的数据大小通常是硬编码的幻数或 (end - start + 1) 样式计算,符号名称可能很长。
  • (o) 透明/不知道地图中的数据大小与地址。

基本上,我正在寻找一种更智能的方法来处理这些情况。我经常发现自己为每个寄存器和每个位键入了大量令人痛苦的长符号名称,还可能还有掩码和移位(后两个取决于数据类型),结果只使用其中的几个(但讨厌稍后重新定义丢失的符号,这就是我在一个会话中输入所有内容的原因)。不过,我注意到要读/写的字节大小大多是幻数,通常需要并排阅读数据表和源代码才能理解最基本的交互。

我想知道其他人如何处理这些情况?我在网上找到了一些例子,其中人们还在大标题中费力地输入每个寄存器、位等,但没有什么是确定的......但是,在这一点上,上述两个选项似乎都不太聪明:(

c i2c

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

标签 统计

c ×2

c-preprocessor ×1

git ×1

git-subtree ×1

i2c ×1

message ×1

modelsim ×1

vhdl ×1

viewer ×1