我们继承了一个针对瑞萨RX231微控制器的项目,我一直在关注它.
该uC只有一条指令锁定总线的原子性(XCHG).
因为处理器是访问RAM存储器的唯一组件(没有使用DMA或DTC),要操纵用户代码中与中断共享的变量,所以中断被禁用(在处理器状态字寄存器中)以获取访问时间,即
disable_interrupts(); /* set_psw(get_psw() & ~(1 << 16)); */
/* access or modify shared variables */
enable_interrupts(); /* set_psw(get_psw() | (1 << 16)); */
Run Code Online (Sandbox Code Playgroud)
但是,还有"标志"在没有保护的情况下共享,这些标志在中断中设置并以下列方式在用户代码中轮询:
volatile unsigned char event_request_message = 0;
unsigned char condition_sending_message = 0;
#pragma interrupt
void on_request_message()
{
...
event_request_message = 1; // mov.l #0x3df5, r14
// mov.b #1, [r14]
...
}
void user_code()
{
for(;;)
{
...
/* might be evaluated multiple times before transmit message is completed */
if(event_request_message && !condition_sending_message) // mov.l …Run Code Online (Sandbox Code Playgroud) 起初我会请你不要误解这个问题.我不是在问SendMessage是如何工作的,但为什么它的工作方式与它一样.基本上,我想知道为什么不能直接从工作线程调用窗口过程,就像从窗口线程那样,而不是将消息泵入消息队列?
在工作线程的一个非常简单的例子中,我可以这样做:
WndProc(hWnd,MY_MESSAGE,wParam,lParam);
Run Code Online (Sandbox Code Playgroud)
代替:
SendMessage(hWnd,MY_MESSAGE,wParam,lParam);
Run Code Online (Sandbox Code Playgroud)
并立即得到答复.你直接打电话给WndProc有什么缺点吗?
我可以理解,当你想要将消息发送到另一个进程所拥有的窗口时,事情会变得更复杂,但是不能存在类似于SendMessage的函数,它在工作线程中的工作方式与窗口相同线?有什么理由背后没有任何存在吗?提前感谢您的任何解释.