S32G3任务抢占

通过S32G3 的STM定时器 实现任务任务抢占

1、创建一个空工程

 

2、创建完成后先生成一版代码

 

 3、编译

 

4、添加user文件夹来存放自己的代码

my_os.h

/*********************************************************************************************************************/
/*-----------------------------------------------------Includes------------------------------------------------------*/
/*********************************************************************************************************************/
#include "my_os.h"
#include "Platform_Types.h"
#include "IntCtrl_Ip.h"
/*********************************************************************************************************************/
/*------------------------------------------------------Macros-------------------------------------------------------*/
/*********************************************************************************************************************/

/*********************************************************************************************************************/
/*-------------------------------------------------Global variables--------------------------------------------------*/
/*********************************************************************************************************************/

/*********************************************************************************************************************/
/*------------------------------------------------Function Prototypes------------------------------------------------*/
/*********************************************************************************************************************/

/*********************************************************************************************************************/
/*---------------------------------------------Function Implementations----------------------------------------------*/
/*********************************************************************************************************************/
#define    STM_0_CR                *(unsigned int *)0x4011C000
#define    STM_0_CNT               *(unsigned int *)0x4011C004
#define    STM_0_CCR0              *(unsigned int *)0x4011C010
#define    STM_0_CIR0              *(unsigned int *)0x4011C014
#define    STM_0_CMP0              *(unsigned int *)0x4011C018

#define    STM_0_CR_TEN_ENABLED        (1<<0)
#define    STM_0_CR_TEN_DISABLED       (0<<0)

#define    STM_0_CLEAN_CNT             (0<<0)

#define    STM_0_CCR0_ENABLED          (1<<0)
#define    STM_0_CCR0_DISABLED         (0<<0)

#define    STM_0_CIR0_CLEAN_IRQ_FLAG   (1<<0)


#define    STM_1_CR                *(unsigned int *)0x40120000
#define    STM_1_CNT               *(unsigned int *)0x40120004
#define    STM_1_CCR0              *(unsigned int *)0x40120010
#define    STM_1_CIR0              *(unsigned int *)0x40120014
#define    STM_1_CMP0              *(unsigned int *)0x40120018

#define    STM_1_CR_TEN_ENABLED        (1<<0)
#define    STM_1_CR_TEN_DISABLED       (0<<0)

#define    STM_1_CLEAN_CNT             (0<<0)

#define    STM_1_CCR0_ENABLED          (1<<0)
#define    STM_1_CCR0_DISABLED         (0<<0)

#define    STM_1_CIR0_CLEAN_IRQ_FLAG   (1<<0)

uint32 STM_0_ISR_Test_Cnt = 0;
uint32 STM_0_ISR_Test_Flg = 0;
ISR(STM_0_ISR)
{
    STM_0_ISR_Test_Flg = 1;
    /* Disabled STM0 */
    STM_0_CR    = (unsigned int)STM_0_CR_TEN_DISABLED;
    /* Disabled ccr0 */
    STM_0_CCR0    = (unsigned int)STM_0_CCR0_DISABLED;

    /* Clean count */
    STM_0_CNT   = (unsigned int)STM_0_CLEAN_CNT;

    /* Enabled STM0 */
    STM_0_CR    |= (unsigned int)STM_0_CR_TEN_ENABLED;
    /* Enabled ccr0 */
    STM_0_CCR0    |= (unsigned int)STM_0_CCR0_ENABLED;
    STM_0_ISR_Test_Cnt++;
    uint32 cnt_flag_1 = 100000;
    while(cnt_flag_1--)
    {
        uint32 cnt_flag_2 = 10000;
        while(cnt_flag_2--)
        {
            __asm("nop");
        }
    }
    STM_0_ISR_Test_Flg = 0;
    /* Clean flag */
    STM_0_CIR0  |= (unsigned int)STM_0_CIR0_CLEAN_IRQ_FLAG;
}

uint32 STM_1_ISR_Test_Cnt = 0;
uint32 STM_1_ISR_Test_Flg = 0;
ISR(STM_1_ISR)
{
    /* Disabled STM1 */
    STM_1_CR    = (unsigned int)STM_1_CR_TEN_DISABLED;
    /* Disabled ccr0 */
    STM_1_CCR0    = (unsigned int)STM_1_CCR0_DISABLED;

    /* Clean count */
    STM_1_CNT   = (unsigned int)STM_1_CLEAN_CNT;

    /* Enabled STM1 */
    STM_1_CR    |= (unsigned int)STM_1_CR_TEN_ENABLED;
    /* Enabled ccr0 */
    STM_1_CCR0    |= (unsigned int)STM_1_CCR0_ENABLED;
    STM_1_ISR_Test_Cnt++;
    if(1 == STM_0_ISR_Test_Flg)
    {
        STM_1_ISR_Test_Flg++;
    }
    /* Clean flag */
    STM_1_CIR0  |= (unsigned int)STM_1_CIR0_CLEAN_IRQ_FLAG;
}

void my_os_init(void)
{
    /* Interrupt the binding callback function */
    IntCtrl_Ip_InstallHandler(STM0_IRQn, STM_0_ISR, NULL_PTR);
    /* Set the interrupt priority */
    IntCtrl_Ip_SetPriority(STM0_IRQn, 4);
    /* Enable STM0 interrupt */
    IntCtrl_Ip_EnableIrq(STM0_IRQn);

    /* Clean count */
    STM_0_CNT    = (unsigned int)STM_0_CLEAN_CNT;
    /* Clean flag */
    STM_0_CIR0  |= (unsigned int)STM_0_CIR0_CLEAN_IRQ_FLAG;
    /* set cmp data */
    STM_0_CMP0   = (unsigned int)(133333 * 1000);
    /* Enabled STM0 */
    STM_0_CR    |= (unsigned int)STM_0_CR_TEN_ENABLED;
    /* Enabled ccr0 */
    STM_0_CCR0    |= (unsigned int)STM_0_CCR0_ENABLED;


    /* Interrupt the binding callback function */
    IntCtrl_Ip_InstallHandler(STM1_IRQn, STM_1_ISR, NULL_PTR);
    /* Set the interrupt priority */
    IntCtrl_Ip_SetPriority(STM1_IRQn, 3);
    /* Enable STM1 interrupt */
    IntCtrl_Ip_EnableIrq(STM1_IRQn);

    /* Clean count */
    STM_1_CNT    = (unsigned int)STM_1_CLEAN_CNT;
    /* Clean flag */
    STM_1_CIR0  |= (unsigned int)STM_1_CIR0_CLEAN_IRQ_FLAG;
    /* set cmp data */
    STM_1_CMP0   = (unsigned int)(133333);
    /* Enabled STM1 */
    STM_1_CR    |= (unsigned int)STM_1_CR_TEN_ENABLED;
    /* Enabled ccr0 */
    STM_1_CCR0    |= (unsigned int)STM_1_CCR0_ENABLED;
}

my_os.h

#ifndef _MY_OS_H_
#define _MY_OS_H_
/*********************************************************************************************************************/
/*-----------------------------------------------------Includes------------------------------------------------------*/
/*********************************************************************************************************************/

/*********************************************************************************************************************/
/*------------------------------------------------------Macros-------------------------------------------------------*/
/*********************************************************************************************************************/

/*********************************************************************************************************************/
/*-------------------------------------------------Global variables--------------------------------------------------*/
/*********************************************************************************************************************/

/*********************************************************************************************************************/
/*------------------------------------------------Function Prototypes------------------------------------------------*/
/*********************************************************************************************************************/
extern void my_os_init(void);

#endif

 

5、添加头文件路径

6、加时钟初始化

 

int main(void)
{
    /* Write your code here */
    /* Initialize Clock */
    Clock_Ip_StatusType Status_Init_Clock = CLOCK_IP_ERROR;
    Status_Init_Clock = Clock_Ip_Init(Mcu_aClockConfigPB);

    if (Status_Init_Clock != CLOCK_IP_SUCCESS)
    {
        while(1); /* Error during initialization. */
    }

    my_os_init();

    for(;;)
    {
        if(exit_code != 0)
        {
            break;
        }
    }
    return exit_code;
}

 

7、跑起来

看到STM_1_ISR_Test_Flg累加 说明更高中断的任务来了,就会发生抢占。

S32G中中断优先级数值越小中断等级越高。

 

posted @ 2024-07-31 11:35  西北小蚂蚁  阅读(5)  评论(0编辑  收藏  举报