大家好,我最近在学习FreeRTOS,在STM32平台上。在官方给出的代码中,关于信号量切换这一章节。 这是定义的中断函数: static void __interrupt __far vExampleInterruptHandler( void ) { static portBASE_TYPE xHigherPriorityTaskWoken; xHigherPriorityTaskWoken = pdFALSE; /* 'Give' the semaphore to unblock the task. */ xSemaphoreGiveFromISR( xBinarySemaphore, &xHigherPriorityTaskWoken ); if( xHigherPriorityTaskWoken == pdTRUE ) { /* 给出信号量以使得等待此信号量的任务解除阻塞。如果解出阻塞的任务的优先级高于当前任务的优先 级 – 强制进行一次任务切换,以确保中断直接返回到解出阻塞的任务(优选级更高)。 说明:在实际使用中,ISR中强制上下文切换的宏依赖于具体移植。此处调用的是基于Open Watcom DOS 移植的宏。其它平台下的移植可能有不同的语法要求。对于实际使用的平台,请参如数对应移植自带的示 例程序,以决定正确的语法和符号。 */ portSWITCH_CONTEXT(); } } 使用这句可以实现一个软件的中断,进入上面的中断函数。 __asm{ int 0x82 } /* 这条语句产生中断 */ int main( void ) { /* 信号量在使用前都必须先创建。本例中创建了一个二值信号量 */ vSemaphoreCreateBinary( xBinarySemaphore ); /* 安装中断服务例程 */ /这里的移植/ _dos_setvect( 0x82, vExampleInterruptHandler ); /* 检查信号量是否成功创建 */ if( xBinarySemaphore != NULL ) { /* 创建延迟处理任务。此任务将与中断同步。延迟处理任务在创建时使用了一个较高的优先级,以保证 中断退出后会被立即执行。在本例中,为延迟处理任务赋予优先级3 */ xTaskCreate( vHandlerTask, "Handler", 1000, NULL, 3, NULL ); /* 创建一个任务用于周期性产生软件中断。此任务的优先级低于延迟处理任务。每当延迟处理任务切出 阻塞态,就会抢占周期任务*/ xTaskCreate( vPeriodicTask, "Periodic", 1000, NULL, 1, NULL ); /* Start the scheduler so the created tasks start executing. */ vTaskStartScheduler(); } /* 如果一切正常,main()函数不会执行到这里,因为调度器已经开始运行任务。但如果程序运行到了这里, 很可能是由于系统内存不足而无法创建空闲任务。第五章会提供更多关于内存管理的信息 */ for( ;; ); } /* 安装中断服务例程 */ /这里的移植/ _dos_setvect( 0x82, vExampleInterruptHandler ); __asm{ int 0x82 } /* 这条语句产生中断 */ 进入中断函数vExampleInterruptHandler 。 我的问题是想知道怎么实现这两者的联系。就是想知道如何移植到STM32上来实现。 在freertos的官网上说要参考编译器的手册,可我实在查不到。 我想问这种姑且被我叫做软件中断的东西如何在移植了freertos的stm32上实现。 谢谢。 |
您能告诉我怎么看么,学生,不知道怎么找。谢谢您