- Mark as New
- Bookmark
- Subscribe
- Mute
- Subscribe to RSS Feed
- Permalink
- Report Inappropriate Content
Hi,
I use OSSemPost in my Interrupt ISR as follow:volatile int frame_ready_edge_capture;
INT8U error_code;
static void handle_frame_ready_interrupts(void* context, alt_u32 id)
{
/* Cast context to dval_edge_capture's type.
* It is important to keep this volatile,
* to avoid compiler optimization issues.
*/
volatile int* frame_ready_edge_capture_ptr = (volatile int*) context;
/* Store the value in the dval's edge capture register in *context. */
*frame_ready_edge_capture_ptr = IORD_ALTERA_AVALON_PIO_EDGE_CAP(FRAME_READY_IRQ_PIO_BASE);
/* Reset the dval's edge capture register. */
IOWR_ALTERA_AVALON_PIO_EDGE_CAP(FRAME_READY_IRQ_PIO_BASE, 0);
/*
* Read the PIO to delay ISR exit. This is done to prevent a spurious
* interrupt in systems with high processor -> pio latency and fast
* interrupts.
*/
IORD_ALTERA_AVALON_PIO_EDGE_CAP(FRAME_READY_IRQ_PIO_BASE);
error_code = OSSemPost(FVSendVideoDataSem);
alt_uCOSIIErrorHandler(error_code, 0);
FrameDown= 1;
IOWR_ALTERA_AVALON_PIO_DATA(LED_PIO_BASE, led0^=1);
//IOWR_ALTERA_AVALON_PIO_DATA(LED_PIO_BASE, led0+=1);
frame_ready_edge_capture= 0;
}
and in my Task: void SendVideoTask()
{
INT16U rgb_tx_buf_cnt= 0;
INT16U cntTCPFrame= 0;
INT16U cntVideoFrame= 0;
INT32U Data_Pixel;
INT16U Data_Pixel_16bit;
alt_u8 dot, Dot, packet= 0, DotCnt= 0;
INT8U error_code, led= 0;
alt_u16 x, y;
.....
.....
OSSemPend(FVSendVideoDataSem, 0, &error_code);
alt_uCOSIIErrorHandler(error_code, 0);
for(y= 0; y<RAW; y++)
{
for(x= 0; x<COL; x++)
{
Data_Pixel= IORD_MY_RGB2YUV_IP_DATA(MY_RGB2YUV_BASE); // read 24bit RGB value
Dot= Data_Pixel; // isolate B
Dot= Data_Pixel >> MY_RGB2YUV_IP_DATA_G_OFST; // isolate G
Dot= Data_Pixel >> MY_RGB2YUV_IP_DATA_R_OFST; // isolate R
Dot= Dot >> 3; // make 5bit for Blue
Dot= Dot >> 2; // make 6bit for Green
Dot= Dot >> 3; // make 5bit for Red
Data_Pixel_16bit= 0;
Data_Pixel_16bit |= Dot << 11 | Dot << 5 | Dot; // merge all in 16bit RGB value
alt_up_pixel_buffer_dma_draw(pixel_buf_dev, Data_Pixel_16bit, x, y); // draw pixel on VGA for debug
}
}
the LED_PIO works well, but my Interrupt with OSSemPost in the ISR and OSSemPend in my Task dosn't work. Could someone say me what I mak ewrong??? Thanks. Antonio
Link Copied
3 Replies
- Mark as New
- Bookmark
- Subscribe
- Mute
- Subscribe to RSS Feed
- Permalink
- Report Inappropriate Content
I watch wrong in the Signal Tap II, my code work good....
sorry- Mark as New
- Bookmark
- Subscribe
- Mute
- Subscribe to RSS Feed
- Permalink
- Report Inappropriate Content
You must write ones, not zeros, in order to clear edge capture and acknowledge the irq.
IOWR_ALTERA_AVALON_PIO_EDGE_CAP(FRAME_READY_IRQ_PIO_BASE, 1); Otherwise the irq would continuously retrigger.- Mark as New
- Bookmark
- Subscribe
- Mute
- Subscribe to RSS Feed
- Permalink
- Report Inappropriate Content
I suggest to disable the interrupt first and re enable it at last with [h=2]alt_irq_enable(IRQ number)[/h]
This will avoid re-triggering problem and make sure that ISR executed successfully
Reply
Topic Options
- Subscribe to RSS Feed
- Mark Topic as New
- Mark Topic as Read
- Float this Topic for Current User
- Bookmark
- Subscribe
- Printer Friendly Page