我正在为没有内存保护的嵌入式系统编写系统级代码(在ARM Cortex-M1上,使用gcc 4.3编译)并且需要直接读/写到内存映射寄存器.到目前为止,我的代码看起来像这样:
#define UART0 0x4000C000
#define UART0CTL (UART0 + 0x30)
volatile unsigned int *p;
p = UART0CTL;
*p &= ~1;
Run Code Online (Sandbox Code Playgroud)
有没有使用指针的更短路(代码更短,我的意思是)?我正在寻找一种方法来编写实际的赋值代码(如果我不得不使用更多的#defines,那就没关系):
*(UART0CTL) &= ~1;
Run Code Online (Sandbox Code Playgroud)
到目前为止我尝试过的任何东西最终都是因为gcc抱怨它无法为左值分配东西......
我正在将一个小型学术操作系统从TriCore移植到ARM Cortex(Thumb-2指令集).为了使调度程序工作,我有时需要将JUMP直接转换为另一个函数,而无需修改堆栈或链接寄存器.
在TriCore上(或者更确切地说,在tricore-g ++上),这个包装器模板(用于任何三个参数函数)可以工作:
template< class A1, class A2, class A3 >
inline void __attribute__((always_inline))
JUMP3( void (*func)( A1, A2, A3), A1 a1, A2 a2, A3 a3 ) {
typedef void (* __attribute__((interrupt_handler)) Jump3)( A1, A2, A3);
( (Jump3)func )( a1, a2, a3 );
}
//example for using the template:
JUMP3( superDispatch, this, me, next );
Run Code Online (Sandbox Code Playgroud)
这将生成汇编程序指令J(又名JUMP),而不是CALL在跳转到(否则正常)C++函数时保持堆栈和CSA不变superDispatch(SchedulerImplementation* obj, Task::Id from, Task::Id to).
现在我需要ARM Cortex上的等效行为(或者更确切地说,对于arm-none-linux-gnueabi-g ++),即生成B(又称BRANCH)指令而不是BLX(又称带有链接和交换的BRANCH).但是没有interrupt_handlerarm-g ++的属性,我找不到任何等效属性.
所以我试图asm …
我们正在使用 Liferay 7.3 (CE) 并试图通过“页面片段”来包含“内容页面”的相对较新的功能。我们能够使用<lfr-widget-WIDGETALIAS>标记开发已经包含 portlet(在内容页面的上下文中称为“小部件”)的页面片段。到目前为止,这是有效的。
现在,我们正在尝试准备嵌入应用了特殊 portlet 配置的portlet 的页面片段。例如,我们想要准备一个页面片段,它只显示一个资产发布者 portlet,该 portlet 被配置为列出来自预定义类别的 WebContent 文章。用户应该能够将该片段放到页面上,而不必关心资产发布者 portlet 的配置。
我们没有找到任何直接的方法来实现这一点——我们的第一个猜测是,配置可以写成<lfr-widget-...>标签的属性或内容,但被 liferay 文档中的一个提示阻止了,即没有有效的属性或内容可以附加到该标签.
是否有人对如何在应用预定义的 Portlet 配置的页面片段中嵌入 Portlet 有所了解?(包括开箱即用的 Liferay portlet?)