From c64f0734dd9afa8d52fe0a09d9ef40720bc421fd Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E9=9B=B6=E4=B8=AD=E6=96=AD=E5=BB=B6=E8=BF=9F=E7=9A=84RTOS?= Date: Thu, 11 Jun 2026 14:08:01 +0000 Subject: [PATCH] =?UTF-8?q?=E5=88=A0=E9=99=A4=E6=96=87=E4=BB=B6=20System/s?= =?UTF-8?q?v=5Ftask.c?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- System/sv_task.c | 826 ----------------------------------------------- 1 file changed, 826 deletions(-) delete mode 100644 System/sv_task.c diff --git a/System/sv_task.c b/System/sv_task.c deleted file mode 100644 index 625a7f8f..00000000 --- a/System/sv_task.c +++ /dev/null @@ -1,826 +0,0 @@ -/**************************************************************************//** - * @item CosyOS-III Kernel - * @file sv_task.c - * @brief 任务服务 - * @details 仅在任务中调用并执行。 - * @author 迟凯峰 - * @version V2.3.5 - * @date 2026.06.10 - ******************************************************************************/ - -#include "os_var.h" -#include "os_api.h" -#include "sv_com.h" -#include "sv_task.h" - -/** - @addtogroup 任务服务 - @{ - */ - -/** 调度解锁(退出嵌套任务临界区)*/ -void su_schedule_unlocks(void) -{ - s_schedulelock_counter--; - if(!s_schedulelock_counter){ - #if (SYSCFG_KERNELLOCKNESTING == __ENABLED__) - if(!s_sign_schedule.every[1] && !s_kernellock_counter){ - #else - if(!s_sign_schedule.every[1]){ - #endif - s_sign_schedule.every[0] = false; - mPendSV_Set(); - while(!s_sign_schedule.every[1]); - } - else{ - s_sign_schedule.every[0] = false; - } - } -} - -/** 内核解锁(退出嵌套服务层临界区)*/ -void su_kernel_unlocks(void) -{ - #if (SYSCFG_KERNELLOCKNESTING == __ENABLED__) - s_kernellock_counter--; - if(s_kernellock_counter) return; - #endif - if(!s_sign_schedule.total){ - mPendSV_Set(); - mSysIRQ_Enable(); - #if (MCUCFG_ISA == __ARM__) - OS_NOP(1); - #endif - while(!s_sign_schedule.every[1]); - } - else{ - mSysIRQ_Enable(); - } -} - -/** 内核解锁(退出非嵌套服务层临界区)并触发任务调度 */ -void su_kernel_unlock0_psv(void) -{ - s_sign_schedule.every[1] = false; - mPendSV_Set(); - mSysIRQ_Enable(); - #if (MCUCFG_ISA == __ARM__) - OS_NOP(1); - #endif - while(!s_sign_schedule.every[1]); -} - -#if (MCUCFG_ISA != __ARM__) -/** 调度上锁(进入嵌套任务临界区)*/ -void su_schedule_locks(void) -{ - s_sign_schedule.every[0] = true; - s_schedulelock_counter++; -} - -/** 内核上锁(进入非嵌套服务层临界区)*/ -void su_kernel_lock0(void) -{ - mSysIRQ_Disable(); -} - -/** 内核解锁(退出非嵌套服务层临界区)*//* -void su_kernel_unlock0(void) -{ - mSysIRQ_Enable(); -}*/ - -/** 内核上锁(进入嵌套服务层临界区)*/ -#if (SYSCFG_KERNELLOCKNESTING == __ENABLED__) -void su_kernel_locks(void) -{ - mSysIRQ_Disable(); - s_kernellock_counter++; -} -#endif - -/** 内核解锁(退出嵌套服务层临界区)并返回(s_ecode_t) */ -s_ecode_t su_kernel_unlocks_rec(s_ecode_t e) -{ - su_kernel_unlocks(); - return e; -} - -/** 内核解锁(退出嵌套服务层临界区)并返回(void *) */ -void *su_kernel_unlocks_rvp(void *p) -{ - su_kernel_unlocks(); - return p; -} -#endif - - -/* - * 操作任务 - */ - -/** - \brief 启动任务 - \param[in] hload 任务装载块句柄 - \param[in] status 任务初始状态 - \return 错误码 - */ -s_ecode_t su_startup_task_0(s_taskload_tsp hload, s_u8_t status) -{ - s_task_status0 = status; - s_task_starter = hload; - s_sign_startup = false; - mPendSV_Set(); - mSysIRQ_Enable(); - #if (MCUCFG_ISA == __ARM__) - OS_NOP(1); - #endif - while(!s_sign_startup); - return s_startup_ecode; -} - -/** - \brief 启动任务 - \param[in] hload 任务装载块句柄 - \param[in] status 任务初始状态 - \param[in] entry 任务函数入口 - \return 错误码 - */ -s_ecode_t su_startup_task_1(s_taskload_tsp hload, s_u8_t status, s_voidvoid_tfp entry) -{ - hload->entry = entry; - return su_startup_task_0(hload, status); -} - -/** - \brief 恢复指定任务并挂起自身任务 - \param[in] htask 任务句柄 - \return 错误码 - */ -s_ecode_t su_resume_suspend(s_taskctrl_tsp htask) -{ - s_ecode_t _ecode = sc_resume_task(htask); - if(_ecode == OS_ECODE_NOERROR || htask->status == OS_STATUS_READY){ - sa_suspend_task(s_task_current); - return OS_ECODE_NOERROR; - } - else{ - return _ecode; - } -} - -#if (SYSCFG_SAMEPRISCHEDULE) -/** - \brief 禅让任务 - \param 无 - \return 无 - */ -void su_yield_tasking(void) -{ - su_kernel_locks(); - #if (SYSCFG_SAMEPRISCHEDULE == __COOPERATIVE__) - s_task_current->yield = true; - #elif (SYSCFG_SAMEPRISCHEDULE == __TIMESHARING__) - s_task_current->tc_counter = ~0; - #endif - s_sign_schedule.every[1] = false; - su_kernel_unlocks(); -} -#endif - -/** - \brief 自身任务延时 - \param[in] tick 滴答周期(延时时间)
- +0:非法
- ~0:无限延时 - \return 无 - */ -void su_delay(s_delay_t tick) -{ - if(~tick) sa_insert_timerlist(s_task_current, tick); - if(!s_sign_schedule.every[0]){ /* 阻塞延时 */ - sa_remove_ready(s_task_current); - s_task_current->status = OS_STATUS_BLOCKED; - su_kernel_unlock0_psv(); - } - else{ /* 就绪延时 */ - s_sign_delay = true; - mSysIRQ_Enable(); - while(s_sign_delay); - } -} - -/* - * 互斥信号量 - */ -#if (SYSCFG_MUTEX == __ENABLED__) -/** - \brief 获取互斥信号量 - \param[in] hmut 互斥信号量句柄 - \param[in] tick 滴答周期(超时时间)
- +0:立即返回
- ~0:无限等待 - \return 结果 - \retval false 失败 - \retval true 成功 - */ -bool su_take_mutex(s_mutex_tsp hmut, s_delay_t tick) -{ - if(!hmut->mutex) goto __RET_TRUE1; - if(s_task_current == hmut->otask) goto __RET_TRUE2; - if(!tick) goto __RET_FALSE; - - if(~tick) sa_insert_timerlist(s_task_current, tick); - sa_insert_blocklist(&hmut->htask); - sa_remove_ready(s_task_current); - s_task_current->status = OS_STATUS_BLOCKED; - s_task_current->blocktype = OS_BLOCKED_MUTEX; - if(s_task_current->pri > hmut->otask->pri){ - #if (SYSCFG_SAMEPRISCHEDULE) - s_taskctrl_tsp link = hmut->otask; - s_task_current->link = link; - do{ - sa_set_taskpri(link, s_task_current->pri); - link = link->link; - }while(link != OS_NULL); - #else - sa_set_taskpri(hmut->otask, s_taskpri_ceiling++); - #endif - } - s_task_current->handle = hmut; - su_kernel_unlock0_psv(); - #if (SYSCFG_MCUCORE == 8051) - hmut = (s_mutex_tsp)s_task_current->handle; - #endif - if(!hmut->mutex) goto __RET_TRUE1; - -__RET_FALSE: - mSysIRQ_Enable(); - return false; - -__RET_TRUE1: - if(hmut->htask != OS_NULL){ - sa_float_to_block(hmut->htask); - } - hmut->otask = s_task_current; - hmut->opri = s_task_current->pri; - -__RET_TRUE2: - hmut->mutex++; - mSysIRQ_Enable(); - return true; -} - -/** - \brief 归还互斥信号量 - \param[in] hmut 互斥信号量句柄 - \return 无 - */ -void su_back_mutex(s_mutex_tsp hmut) -{ - if(!hmut->mutex); - else if(s_task_current == hmut->otask){ - hmut->mutex--; - if(!hmut->mutex){ - if(s_task_current->pri > hmut->opri){ - sa_set_taskpri(s_task_current, hmut->opri); - #if (!SYSCFG_SAMEPRISCHEDULE) - s_taskpri_ceiling--; - #endif - } - if(hmut->htask != OS_NULL){ - sa_block_to_float(hmut->htask); - } - } - } - su_kernel_unlocks(); -} -#endif - - -/* - * 二值信号量 - */ -#if (SYSCFG_BINARY == __ENABLED__) -/** - \brief 等待二值信号量 - \param[in] hbin 二值信号量句柄 - \param[in] tick 滴答周期(超时时间)
- +0:立即返回
- ~0:无限等待 - \return 结果 - \retval false 失败 - \retval true 成功 - */ -bool su_wait_binary(s_binary_tsp hbin, s_delay_t tick) -{ - if(hbin->binary) goto __RET_TRUE; - if(!tick) goto __RET_FALSE; - - if(~tick) sa_insert_timerlist(s_task_current, tick); - sa_insert_blocklist(&hbin->htask); - sa_remove_ready(s_task_current); - s_task_current->status = OS_STATUS_BLOCKED; - s_task_current->blocktype = OS_BLOCKED_BINARY; - s_task_current->handle = hbin; - su_kernel_unlock0_psv(); - #if (SYSCFG_MCUCORE == 8051) - hbin = (s_binary_tsp)s_task_current->handle; - #endif - if(hbin->binary) goto __RET_TRUE; - -__RET_FALSE: - mSysIRQ_Enable(); - return false; - -__RET_TRUE: - mSysIRQ_Enable(); - return true; -} - -/** - \brief 获取二值信号量 - \param[in] hbin 二值信号量句柄 - \param[in] tick 滴答周期(超时时间)
- +0:立即返回
- ~0:无限等待 - \return 结果 - \retval false 失败 - \retval true 成功 - */ -bool su_take_binary(s_binary_tsp hbin, s_delay_t tick) -{ - if(hbin->binary) goto __RET_TRUE; - if(!tick) goto __RET_FALSE; - - if(~tick) sa_insert_timerlist(s_task_current, tick); - sa_insert_blocklist(&hbin->htask); - sa_remove_ready(s_task_current); - s_task_current->status = OS_STATUS_BLOCKED; - s_task_current->blocktype = OS_BLOCKED_BINARY; - s_task_current->handle = hbin; - su_kernel_unlock0_psv(); - #if (SYSCFG_MCUCORE == 8051) - hbin = (s_binary_tsp)s_task_current->handle; - #endif - if(hbin->binary) goto __RET_TRUE; - -__RET_FALSE: - mSysIRQ_Enable(); - return false; - -__RET_TRUE: - if(hbin->htask != OS_NULL){ - sa_float_to_block(hbin->htask); - } - hbin->binary = false; - mSysIRQ_Enable(); - return true; -} -#endif - - -/* - * 计数信号量 - */ -#if (SYSCFG_SEMAPHORE == __ENABLED__) -/** - \brief 获取计数信号量 - \param[in] hsem 计数信号量句柄 - \param[in] tick 滴答周期(超时时间)
- +0:立即返回
- ~0:无限等待 - \return 结果 - \retval false 失败 - \retval true 成功 - */ -bool su_take_semaph(s_semaph_tsp hsem, s_delay_t tick) -{ - s_semaph_t counter; - counter = hsem->counter; - if(counter) goto __RET_TRUE; - if(!tick) goto __RET_FALSE; - - if(~tick) sa_insert_timerlist(s_task_current, tick); - sa_insert_blocklist(&hsem->htask); - sa_remove_ready(s_task_current); - s_task_current->status = OS_STATUS_BLOCKED; - s_task_current->blocktype = OS_BLOCKED_SEMAPHORE; - s_task_current->handle = hsem; - su_kernel_unlock0_psv(); - #if (SYSCFG_MCUCORE == 8051) - hsem = (s_semaph_tsp)s_task_current->handle; - #endif - counter = hsem->counter; - if(counter) goto __RET_TRUE; - -__RET_FALSE: - mSysIRQ_Enable(); - return false; - -__RET_TRUE: - counter--; - if(!counter && hsem->htask != OS_NULL){ - sa_float_to_block(hsem->htask); - } - hsem->counter = counter; - mSysIRQ_Enable(); - return true; -} -#endif - - -/* - * 私信 - */ -#if (SYSCFG_TASKMSG == __ENABLED__) -/** - \brief 接收私信 - \param[in] tmrf 私信标志 - \param[in] tick 滴答周期(超时时间)
- +0:立即返回
- ~0:无限等待 - \return 结果 - \retval false 失败 - \retval true 成功 - */ -bool su_recv_taskmsg(s_u8_t volatile _STATIC_MEM_ *tmrf, s_delay_t tick) -{ - if(*tmrf) goto __RET_TRUE; - if(!tick) goto __RET_FALSE; - - if(~tick) sa_insert_timerlist(s_task_current, tick); - sa_remove_ready(s_task_current); - s_task_current->status = OS_STATUS_BLOCKED; - s_task_current->blocktype = OS_BLOCKED_TASKMSG; - #if (SYSCFG_MCUCORE == 8051) - s_task_current->handle = (void *)tmrf; - #endif - su_kernel_unlock0_psv(); - #if (SYSCFG_MCUCORE == 8051) - tmrf = (s_u8_t volatile _STATIC_MEM_ *)s_task_current->handle; - #endif - if(*tmrf) goto __RET_TRUE; - -__RET_FALSE: - mSysIRQ_Enable(); - return false; - -__RET_TRUE: - *tmrf = 2; - (*s_task_current->entry)(); - mSysIRQ_Enable(); - return true; -} -#endif - - -/* - * 飞信 - */ -#if (SYSCFG_FETION == __ENABLED__) -/** - \brief 退出非嵌套服务层临界区并返回飞信 - \param[in] htbox 信箱句柄 - \return 飞信 - */ -__STATIC_FORCEINLINE m_fetion_t _unlock0_rfet_(s_tionbox_tsp htbox) -{ - m_fetion_t tion = htbox->tion; - htbox->tion = false; - mSysIRQ_Enable(); - return tion; -} - -/** - \brief 接收飞信 - \param[in] htbox 信箱句柄 - \param[in] tick 滴答周期(超时时间)
- +0:立即返回
- ~0:无限等待 - \return 飞信 - \retval false 失败 - */ -m_fetion_t su_recv_fetion(s_tionbox_tsp htbox, s_delay_t tick) -{ - if(htbox->tion) goto __RET_TION; - if(!tick) goto __RET_FALSE; - - if(~tick) sa_insert_timerlist(s_task_current, tick); - sa_insert_blocklist(&htbox->htask); - sa_remove_ready(s_task_current); - s_task_current->status = OS_STATUS_BLOCKED; - s_task_current->blocktype = OS_BLOCKED_FETION; - s_task_current->handle = htbox; - su_kernel_unlock0_psv(); - #if (SYSCFG_MCUCORE == 8051) - htbox = (s_tionbox_tsp)s_task_current->handle; - #endif - -__RET_TION: - return _unlock0_rfet_(htbox); - -__RET_FALSE: - mSysIRQ_Enable(); - return false; -} -#endif - - -/** 退出非嵌套服务层临界区并返回(void *) */ -#if (SYSCFG_MAILBOX == __ENABLED__ || SYSCFG_MSGQUEUE == __ENABLED__) -__STATIC_FORCEINLINE void *_unlock0_rvp_(void *p) -{ - mSysIRQ_Enable(); - return p; -} -#endif - - -/* - * 邮箱 - */ -#if (SYSCFG_MAILBOX == __ENABLED__) -/** - \brief 接收邮件 - \param[in] hmbox 邮箱句柄 - \param[in] tick 滴答周期(超时时间)
- +0:立即返回
- ~0:无限等待 - \return 邮件指针 - \retval NULL 失败 - */ -void *su_recv_mail(s_mailbox_tsp hmbox, s_delay_t tick) -{ - if(hmbox->flag) goto __RET_MAIL; - if(!tick) goto __RET_NULL; - - if(~tick) sa_insert_timerlist(s_task_current, tick); - sa_insert_blocklist(&hmbox->htask); - sa_remove_ready(s_task_current); - s_task_current->status = OS_STATUS_BLOCKED; - s_task_current->blocktype = OS_BLOCKED_MAIL; - s_task_current->handle = hmbox; - su_kernel_unlock0_psv(); - #if (SYSCFG_MCUCORE == 8051) - hmbox = (s_mailbox_tsp)s_task_current->handle; - #endif - if(hmbox->flag) goto __RET_MAIL; - -__RET_NULL: - mSysIRQ_Enable(); - return OS_NULL; - -__RET_MAIL: - hmbox->flag = false; - return _unlock0_rvp_(hmbox->mail); -} -#endif - - -/* - * 消息队列 - */ -#if (SYSCFG_MSGQUEUE == __ENABLED__) -/** - \brief 接收消息 - \param[in] hque 队列句柄 - \param[in] tick 滴答周期(超时时间)
- +0:立即返回
- ~0:无限等待 - \return 消息指针 - \retval NULL 失败 - */ -void *su_recv_msg(s_msgque_tsp hque, s_delay_t tick) -{ - void *msg; - hque->mutex = false; - - if(hque->counter) goto __RECV_MSG; - if(!tick) goto __RET_NULL; - - hque->mutex = true; - if(~tick) sa_insert_timerlist(s_task_current, tick); - sa_insert_blocklist(&hque->htask); - sa_remove_ready(s_task_current); - s_task_current->status = OS_STATUS_BLOCKED; - s_task_current->blocktype = OS_BLOCKED_MSG; - s_task_current->handle = hque; - su_kernel_unlock0_psv(); - #if (SYSCFG_MCUCORE == 8051) - hque = (s_msgque_tsp)s_task_current->handle; - #endif - hque->mutex = false; - if(!hque->counter) goto __RET_NULL; - -__RECV_MSG: - if(hque->type == __DYNAMIC__){ - msg = sc_recv_msg_dynque((s_dynque_tsp)hque); - } - else{ - msg = sc_recv_msg_staque((s_staque_tsp)hque); - } - hque->mutex = true; - return _unlock0_rvp_(msg); - -__RET_NULL: - hque->mutex = true; - mSysIRQ_Enable(); - return OS_NULL; -} -#endif - - -/* - * 事件标志组 - */ -#if (SYSCFG_FLAGGROUP == __ENABLED__) -/** - \brief 查询标志组 - \param[in] hgrp 标志组句柄 - \param[in] size sizeof(group) - \return 结果 - \retval false 失败 - \retval true 成功 - */ -bool su_query_group(void volatile _STATIC_MEM_ *hgrp, s_u8_t size) -{ - switch(size){ - case 1: if(*(s_u8_t *)hgrp) goto __RET_TRUE; break; - case 2: if(*(s_u16_t *)hgrp) goto __RET_TRUE; break; - case 4: if(*(s_u32_t *)hgrp) goto __RET_TRUE; break; - } - su_kernel_unlocks(); - return false; - -__RET_TRUE: - su_kernel_unlocks(); - return true; -} - -/** - \brief 等待标志组_1 - \param[in] hgrp 标志组句柄 - \param[in] tick 滴答周期(超时时间)
- +0:立即返回
- ~0:无限等待 - \return 结果 - \retval false 失败 - \retval true 成功 - */ -bool su_wait_group_1(s_u8_t volatile _STATIC_MEM_ *hgrp, s_delay_t tick) -{ - if(*hgrp) goto __RET_TRUE; - if(!tick) goto __RET_FALSE; - - if(~tick) sa_insert_timerlist(s_task_current, tick); - sa_remove_ready(s_task_current); - s_task_current->status = OS_STATUS_BLOCKED; - s_task_current->blocktype = 1; - s_task_current->handle = (void *)hgrp; - su_kernel_unlock0_psv(); - #if (SYSCFG_MCUCORE == 8051) - hgrp = (s_u8_t volatile _STATIC_MEM_ *)s_task_current->handle; - #endif - if(*hgrp) goto __RET_TRUE; - -__RET_FALSE: - mSysIRQ_Enable(); - return false; - -__RET_TRUE: - mSysIRQ_Enable(); - return true; -} - -/** - \brief 等待标志组_2 - \param[in] hgrp 标志组句柄 - \param[in] tick 滴答周期(超时时间)
- +0:立即返回
- ~0:无限等待 - \return 结果 - \retval false 失败 - \retval true 成功 - */ -bool su_wait_group_2(s_u16_t volatile _STATIC_MEM_ *hgrp, s_delay_t tick) -{ - if(*hgrp) goto __RET_TRUE; - if(!tick) goto __RET_FALSE; - - if(~tick) sa_insert_timerlist(s_task_current, tick); - sa_remove_ready(s_task_current); - s_task_current->status = OS_STATUS_BLOCKED; - s_task_current->blocktype = 2; - s_task_current->handle = (void *)hgrp; - su_kernel_unlock0_psv(); - #if (SYSCFG_MCUCORE == 8051) - hgrp = (s_u16_t volatile _STATIC_MEM_ *)s_task_current->handle; - #endif - if(*hgrp) goto __RET_TRUE; - -__RET_FALSE: - mSysIRQ_Enable(); - return false; - -__RET_TRUE: - mSysIRQ_Enable(); - return true; -} - -/** - \brief 等待标志组_4 - \param[in] hgrp 标志组句柄 - \param[in] tick 滴答周期(超时时间)
- +0:立即返回
- ~0:无限等待 - \return 结果 - \retval false 失败 - \retval true 成功 - */ -bool su_wait_group_4(s_u32_t volatile _STATIC_MEM_ *hgrp, s_delay_t tick) -{ - if(*hgrp) goto __RET_TRUE; - if(!tick) goto __RET_FALSE; - - if(~tick) sa_insert_timerlist(s_task_current, tick); - sa_remove_ready(s_task_current); - s_task_current->status = OS_STATUS_BLOCKED; - s_task_current->blocktype = 4; - s_task_current->handle = (void *)hgrp; - su_kernel_unlock0_psv(); - #if (SYSCFG_MCUCORE == 8051) - hgrp = (s_u32_t volatile _STATIC_MEM_ *)s_task_current->handle; - #endif - if(*hgrp) goto __RET_TRUE; - -__RET_FALSE: - mSysIRQ_Enable(); - return false; - -__RET_TRUE: - mSysIRQ_Enable(); - return true; -} -#endif - - -/* - * 动态内存 - */ -#if (SYSCFG_DYNMEMMGE == __ENABLED__) -/** - \brief uxalloc - \param[in] p - \return 指针 - \retval NULL 失败 - */ -void _MALLOC_MEM_ *su_xalloc(void _MALLOC_MEM_ *p) -{ - su_kernel_unlocks(); - return p; -} - -/** - \brief 初始化线程内存池 - \param[in] hmem 线程内存句柄 - \param[in] size 内存池大小 - \return 结果 - \retval false 失败 - \retval true 成功 - */ -bool su_init_mempool(s_thrmem_tsp hmem, size_t size) -{ - hmem->head = hmem->move = (void _MALLOC_MEM_ *)s_malloc(size); - if(hmem->head == OS_NULL){ - su_kernel_unlocks(); - return false; - } - else{ - hmem->size = size; - su_kernel_unlocks(); - return true; - } -} - -/** - \brief 线程内存分配 - \param[in] hmem 线程内存句柄 - \param[in] size 内存块大小 - \return 指针 - \retval NULL 失败 - */ -void _MALLOC_MEM_ *su_talloc(s_thrmem_tsp hmem, size_t size) -{ - if(hmem->head == OS_NULL || (size_t)hmem->move - (size_t)hmem->head + size > hmem->size){ - return OS_NULL; - } - else{ - void _MALLOC_MEM_ *r = hmem->move; - hmem->move = (s_u8_t _MALLOC_MEM_ *)hmem->move + size; - return r; - } -} -#endif - -/** @} */