从直接调用的静态方法中获取 class object 指针
Get class object pointer from inside a static method called directly
我有以下 class,例如 header:
class Uart
{
public:
Uart (int ch, int bd = 9600, bool doinit = false);
......
static void isr (void);
}
这个想法是class代表USART硬件,与SPI、RTC等方式相同,我在期间将静态成员isr的地址设置为中断向量例程运行时间。
例如像这样
extern "C"
{
void
Uart::isr (void)
{
if ( USART1->SR & USART_SR_RXNE) //receive
{
short c = USART2->DR;
USART1->DR = c;
USART1->SR &= ~USART_SR_RXNE;
;
}
else if ( USART1->SR & USART_SR_TC) //transfer
{
USART1->SR &= ~USART_SR_TC;
}
}
}
并设置为中断向量,例如
_vectors_[USART1_IRQn + IRQ0_EX] = (word) &dbgout.isr;
所以每次 "callback" 例程被 CPU 调用时,我想访问它 "parent" object 以保存 and/or 操作接收到的以用户友好的方式提供数据。
有可能吗?也许以某种方式组织 class 或其他什么。
该体系结构严格为 32 位(ARM、gcc)
静态方法对对象一无所知。
您需要一种不同的方法:
// Create interrupt handler method (non-static!)
void Uart::inthandler() {
// whatever is needed here
}
// Create object
Uart* p = new Uart(...);
// Create interrupt handler function
void inthandler() {
if (p != NULL) {
p->inthandler();
}
}
// Install the interrupt handler function
InstallIntHandler(IRQ, inthandler);
这只是一个原则,必须适应您的特定环境。
我有以下 class,例如 header:
class Uart
{
public:
Uart (int ch, int bd = 9600, bool doinit = false);
......
static void isr (void);
}
这个想法是class代表USART硬件,与SPI、RTC等方式相同,我在期间将静态成员isr的地址设置为中断向量例程运行时间。
例如像这样
extern "C"
{
void
Uart::isr (void)
{
if ( USART1->SR & USART_SR_RXNE) //receive
{
short c = USART2->DR;
USART1->DR = c;
USART1->SR &= ~USART_SR_RXNE;
;
}
else if ( USART1->SR & USART_SR_TC) //transfer
{
USART1->SR &= ~USART_SR_TC;
}
}
}
并设置为中断向量,例如
_vectors_[USART1_IRQn + IRQ0_EX] = (word) &dbgout.isr;
所以每次 "callback" 例程被 CPU 调用时,我想访问它 "parent" object 以保存 and/or 操作接收到的以用户友好的方式提供数据。
有可能吗?也许以某种方式组织 class 或其他什么。
该体系结构严格为 32 位(ARM、gcc)
静态方法对对象一无所知。
您需要一种不同的方法:
// Create interrupt handler method (non-static!)
void Uart::inthandler() {
// whatever is needed here
}
// Create object
Uart* p = new Uart(...);
// Create interrupt handler function
void inthandler() {
if (p != NULL) {
p->inthandler();
}
}
// Install the interrupt handler function
InstallIntHandler(IRQ, inthandler);
这只是一个原则,必须适应您的特定环境。