STM32 FreeRTOS信号量(软件中断实现)
大家好,我最近在学习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上实现。
谢谢。
一个人也没有么 pendsv?SWI中断?官方给提供了软中断的例子,你可以查看一下。 高二毛 发表于 2016-10-11 10:31
pendsv?SWI中断?官方给提供了软中断的例子,你可以查看一下。
您能告诉我怎么看么,学生,不知道怎么找。谢谢您 帮忙顶
页:
[1]