在试图让GCC不会产生负载-修改店经营每次我做的时间|=或&=,我已经定义了下面的宏:
#define bset(base, offset, mask) bmanip(set, base, offset, mask)
#define bclr(base, offset, mask) bmanip(clr, base, offset, mask)
#define bmanip(op, base, offset, mask) \
asm("pshx");\
asm("ldx " #base);\
asm("b" #op " " #offset ",x " #mask);\
asm("pulx")
Run Code Online (Sandbox Code Playgroud)
他们工作得很好; 拆解后的二进制文件非常完美.
当我按顺序使用多个时,问题出现了:
inline void spi_init()
{
bset(_io_ports, M6811_DDRD, 0x38);
bset(_io_ports, M6811_PORTD, 0x20);
bset(_io_ports, M6811_SPCR, (M6811_SPE | M6811_DWOM | M6811_MSTR));
}
Run Code Online (Sandbox Code Playgroud)
这导致:
00002227 <spi_init>:
2227: 3c pshx
2228: fe 10 00 ldx 0x1000 <_io_ports>
222b: 1c 09 38 bset 0x9,x, …Run Code Online (Sandbox Code Playgroud) 我想知道是否有人使用GCC作为飞思卡尔68HC12微控制器系列的生产稳定工具链.在我看来,除了飞思卡尔本身和宇宙软件(http://www.cosmic-software.com/)和IAR(http://www.iar)之外,还没有最新的工具链..com /),当然.
MegaSquirt(http://www.msextra.com/tools/)似乎提供了最维护的工具链,打包于2010年10月29日.它是基于SCz工具的扩展版本(我不知道它意味着什么) :
在我的8位飞思卡尔HCS08微型计算机上,每当我调用一个库函数,它返回值指向我传递它,我真的不想要它们,我扔了一个NULL,例如
UART_SendBlock((char *)txstr, strlen(txstr), NULL);
Run Code Online (Sandbox Code Playgroud)
最后一个参数的类型是 uint16_t *并返回实际发送的字符数,这是我不关心的值.
但是,每当调用该函数时,我的微型端口上的端口A出现了问题,并且调试向我指出了这个问题搞砸了.端口A的配置寄存器位于地址0x0000和0x0001,这是NULL(aka (void *)0)指向的地方.我认为NULL它实际上并不是什么魔法,但它似乎并不是这样.
我的解决方法感觉非常黑客:
#define MNUL (void *)(&mynull)
uint32_t mynull;
Run Code Online (Sandbox Code Playgroud)
有更好的解决方案吗?我尝试将MNUL定义到处理器上未使用的内存段,但这会导致立即重置.
在维修仪表组时,我需要使用 Forth 更换基于 Motorola MC68HC11构建的控制器。虽然我能够转储整个内存,但不知道使用的是哪个 Forth,并且可用的单词似乎非常有限。
在嵌入式 Forth 环境中如何定位和更改内存中的已知值?