204 lines
6.0 KiB
C
204 lines
6.0 KiB
C
/*
|
|
* Copyright (c) 2013-2019 Huawei Technologies Co., Ltd. All rights reserved.
|
|
* Copyright (c) 2020-2021 Huawei Device Co., Ltd. All rights reserved.
|
|
*
|
|
* Redistribution and use in source and binary forms, with or without modification,
|
|
* are permitted provided that the following conditions are met:
|
|
*
|
|
* 1. Redistributions of source code must retain the above copyright notice, this list of
|
|
* conditions and the following disclaimer.
|
|
*
|
|
* 2. Redistributions in binary form must reproduce the above copyright notice, this list
|
|
* of conditions and the following disclaimer in the documentation and/or other materials
|
|
* provided with the distribution.
|
|
*
|
|
* 3. Neither the name of the copyright holder nor the names of its contributors may be used
|
|
* to endorse or promote products derived from this software without specific prior written
|
|
* permission.
|
|
*
|
|
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
|
|
* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
|
|
* THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
|
|
* PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR
|
|
* CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
|
|
* EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
|
|
* PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS;
|
|
* OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
|
|
* WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
|
|
* OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
|
|
* ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
|
*/
|
|
|
|
#include "debug.h"
|
|
#include "los_tick.h"
|
|
#include "los_task.h"
|
|
#include "los_config.h"
|
|
#include "los_interrupt.h"
|
|
#include "los_debug.h"
|
|
#include "los_compiler.h"
|
|
|
|
/* Global define */
|
|
|
|
|
|
/* Global Variable */
|
|
__attribute__((aligned (8))) UINT8 g_memStart[LOSCFG_SYS_HEAP_SIZE];
|
|
UINT32 g_VlaueSp=0;
|
|
|
|
/*********************************************************************
|
|
* @fn taskSampleEntry2
|
|
*
|
|
* @brief taskSampleEntry2 program.
|
|
*
|
|
* @return none
|
|
*/
|
|
VOID taskSampleEntry2(VOID)
|
|
{
|
|
while(1) {
|
|
LOS_TaskDelay(10000);
|
|
printf("taskSampleEntry2 running,task2 SP:%08x\n",__get_SP());
|
|
}
|
|
}
|
|
|
|
/*********************************************************************
|
|
* @fn taskSampleEntry1
|
|
*
|
|
* @brief taskSampleEntry1 program.
|
|
*
|
|
* @return none
|
|
*/
|
|
VOID taskSampleEntry1(VOID)
|
|
{
|
|
while(1) {
|
|
LOS_TaskDelay(2000);
|
|
printf("taskSampleEntry1 running,task1 SP:%08x\n",__get_SP());
|
|
}
|
|
|
|
}
|
|
|
|
/*********************************************************************
|
|
* @fn EXTI0_INT_INIT
|
|
*
|
|
* @brief Initializes EXTI0 collection.
|
|
*
|
|
* @return none
|
|
*/
|
|
void EXTI0_INT_INIT(void)
|
|
{
|
|
GPIO_InitTypeDef GPIO_InitStructure={0};
|
|
EXTI_InitTypeDef EXTI_InitStructure={0};
|
|
NVIC_InitTypeDef NVIC_InitStructure={0};
|
|
|
|
RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO|RCC_APB2Periph_GPIOA,ENABLE);
|
|
|
|
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0;
|
|
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU;
|
|
GPIO_Init(GPIOA, &GPIO_InitStructure);
|
|
|
|
/* GPIOA ----> EXTI_Line0 */
|
|
GPIO_EXTILineConfig(GPIO_PortSourceGPIOA,GPIO_PinSource0);
|
|
EXTI_InitStructure.EXTI_Line=EXTI_Line0;
|
|
EXTI_InitStructure.EXTI_Mode = EXTI_Mode_Interrupt;
|
|
EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Falling;
|
|
EXTI_InitStructure.EXTI_LineCmd = ENABLE;
|
|
EXTI_Init(&EXTI_InitStructure);
|
|
|
|
NVIC_InitStructure.NVIC_IRQChannel = EXTI0_IRQn;
|
|
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;
|
|
NVIC_InitStructure.NVIC_IRQChannelSubPriority = 4;
|
|
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
|
|
NVIC_Init(&NVIC_InitStructure);
|
|
}
|
|
|
|
/*********************************************************************
|
|
* @fn taskSample
|
|
*
|
|
* @brief taskSample program.
|
|
*
|
|
* @return none
|
|
*/
|
|
UINT32 taskSample(VOID)
|
|
{
|
|
UINT32 uwRet;
|
|
UINT32 taskID1,taskID2;
|
|
TSK_INIT_PARAM_S stTask={0};
|
|
stTask.pfnTaskEntry = (TSK_ENTRY_FUNC)taskSampleEntry1;
|
|
stTask.uwStackSize = 0X500;
|
|
stTask.pcName = "taskSampleEntry1";
|
|
stTask.usTaskPrio = 6;/* high priority */
|
|
uwRet = LOS_TaskCreate(&taskID1, &stTask);
|
|
if (uwRet != LOS_OK) {
|
|
printf("create task1 failed\n");
|
|
}
|
|
|
|
stTask.pfnTaskEntry = (TSK_ENTRY_FUNC)taskSampleEntry2;
|
|
stTask.uwStackSize = 0X500;
|
|
stTask.pcName = "taskSampleEntry2";
|
|
stTask.usTaskPrio = 7;/* low priority */
|
|
uwRet = LOS_TaskCreate(&taskID2, &stTask);
|
|
if (uwRet != LOS_OK) {
|
|
printf("create task2 failed\n");
|
|
}
|
|
|
|
EXTI0_INT_INIT();
|
|
return LOS_OK;
|
|
}
|
|
|
|
/*********************************************************************
|
|
* @fn main
|
|
*
|
|
* @brief Main program.
|
|
*
|
|
* @return none
|
|
*/
|
|
LITE_OS_SEC_TEXT_INIT int main(void)
|
|
{
|
|
unsigned int ret;
|
|
|
|
NVIC_PriorityGroupConfig(NVIC_PriorityGroup_0);
|
|
Delay_Init();
|
|
USART_Printf_Init(115200);
|
|
printf("SystemClk:%d\r\n",SystemCoreClock);
|
|
|
|
ret = LOS_KernelInit();
|
|
taskSample();
|
|
if (ret == LOS_OK)
|
|
{
|
|
LOS_Start();
|
|
}
|
|
|
|
printf("shouldn't run at here!!!\r\n");
|
|
while (1) {
|
|
__asm volatile("nop");
|
|
}
|
|
|
|
}
|
|
|
|
/*********************************************************************
|
|
* @fn EXTI0_IRQHandler
|
|
*
|
|
* @brief This function handles EXTI0 Handler.
|
|
*
|
|
* @return none
|
|
*/
|
|
void EXTI0_IRQHandler(void) __attribute__((interrupt()));
|
|
void EXTI0_IRQHandler(void)
|
|
{
|
|
/* 中断栈使用的是原来调用main设置的值,将中断栈和线程栈分开,这样线程跳中断,中断函数如果嵌套深度较大,不至于
|
|
* 线程栈被压满溢出,但是采用当前方式,线程进中断时,编译器保存到的16个caller寄存器任然压入线程栈,如果需要希
|
|
* 望caller寄存器压入中断栈,则中断函数的入口和出口需要使用汇编,中间调用用户中断处理函数即可,详见los_exc.S
|
|
* 中的ipq_entry例子
|
|
* */
|
|
GET_INT_SP();
|
|
HalIntEnter();
|
|
if(EXTI_GetITStatus(EXTI_Line0)!=RESET)
|
|
{
|
|
g_VlaueSp= __get_SP();
|
|
printf("Run at EXTI:");
|
|
printf("interruption sp:%08x\r\n",g_VlaueSp);
|
|
HalDisplayTaskInfo();
|
|
EXTI_ClearITPendingBit(EXTI_Line0); /* Clear Flag */
|
|
}
|
|
HalIntExit();
|
|
FREE_INT_SP();
|
|
}
|