diff --git a/System/sv_int_loc.h b/System/sv_int_loc.h new file mode 100644 index 0000000..45ddef4 --- /dev/null +++ b/System/sv_int_loc.h @@ -0,0 +1,143 @@ +/**************************************************************************//** + * @item CosyOS-II Kernel + * @file sv_int_loc.h + * @brief 中断本地服务(仅在用户中断中调用,并在本地执行) + * @author 迟凯峰 + * @version V1.3.1 + * @date 2024.01.25 + ******************************************************************************/ + +#ifndef __SV_INT_LOC_H +#define __SV_INT_LOC_H + +void si_task_scheduling(void); +void si_taskpri_scheduling(s_tasknode_tsp node); +s_bool_t si_take_binary(s_binary_tsp bin); +void si_back_binary(s_binary_tsp bin); +m_fetion_t si_recv_fetion(s_fetion_tsp fet); +#if SYSCFG_MCUCORE == 8051 +s_bool_t si_can_read_gmbox(void _OBJ_MEM_ *gm); +s_bool_t si_can_read_lmbox(void); +void *si_get_lmbox(void); +s_bool_t si_can_access_msgqueue(s_msgqueue_tsp queue); +#else +s_bool_t si_recv_mail(void *lm, s_mailbox_tsp gm, size_t size) MCUCFG_251_REENTRANT; +#endif +void *si_recv_msg (s_msgqueue_tsp queue); + + + +/* + * 任务优先级调度 + */ + +#define sISV_TaskPriScheduling(node) \ + si_taskpri_scheduling(node) + + + +/* + * 二值信号量 + */ + +/* 获取 */ +#define sISV_TakeBin(bin) \ + si_take_binary(&bin) + +/* 归还 */ +#define sISV_BackBin(bin) \ + si_back_binary(&bin) + + + +/* + * 飞信(接收飞信) + */ + +#define sISV_RecvFetion(tbox) \ + si_recv_fetion(&tbox) + + + +/* + * 消息邮箱(接收邮件) + */ +#if SYSCFG_MCUCORE == 8051 +#if SYSCFG_MAILBOX_ACCESSMECHANISM == 0 +#define sISV_RecvMail(mail, mbox) \ +( \ + si_can_read_gmbox((s_mailbox_tsp)&mbox) \ + ? mbox.gf \ + ? s_memcpy(mail, &mbox.mail0, sizeof(mbox.mail0)) || true \ + ? mbox.gf-- \ + : mbox.gf-- \ + : false \ + : false \ +) + +#elif SYSCFG_MAILBOX_ACCESSMECHANISM == 1 +#define sISV_RecvMail(mail, mbox) \ +( \ + si_can_read_gmbox((s_mailbox_tsp)&mbox) \ + ? mbox.gf \ + ? s_memcpy(mail, &mbox.mail0, sizeof(mbox.mail0)) || true \ + ? mbox.gf-- \ + : mbox.gf-- \ + : false \ + : si_can_read_lmbox() \ + ? s_memcpy(mail, si_get_lmbox(), sizeof(mbox.mail0)) || true \ + ? true \ + : true \ + : false \ +) + +#endif +#else +#define sISV_RecvMail(mail, mbox) \ + si_recv_mail(mail, (s_mailbox_tsp)&mbox, sizeof(mbox.mail0)) + +#endif + + + +/* + * 消息队列(接收消息) + */ +#if SYSCFG_MCUCORE == 8051 +#define sISV_RecvMsg(que) \ +( \ + si_can_access_msgqueue(que) ? si_recv_msg(que) : NULL \ +) +#else +#define sISV_RecvMsg(que) \ + si_recv_msg(que) +#endif + + + +/* + * 事件标志组 + */ + + /* 查询标志组 */ +#define sISV_QueryFlagGroup(group) \ +( \ + sizeof(group) == 1 ? *(s_u8_t *)&group ? true : false \ + : sizeof(group) == 2 ? *(s_u16_t *)&group ? true : false \ + : sizeof(group) == 4 ? *(s_u32_t *)&group ? true : false \ + : false \ +) + + + +/* + * 软件RTC + */ + +/* 获取时间 */ +#define sISV_GetTime(t) \ + s_memcpy(t, !iWhichGVar_Read ? s_rtc[0] : s_rtc[1], sizeof(s_rtc[0])) + + + +#endif diff --git a/System/sv_task.h b/System/sv_task.h new file mode 100644 index 0000000..d63b090 --- /dev/null +++ b/System/sv_task.h @@ -0,0 +1,417 @@ +/**************************************************************************//** + * @item CosyOS-II Kernel + * @file sv_task.h + * @brief 任务服务(仅在任务中调用) + * @author 迟凯峰 + * @version V1.3.1 + * @date 2024.01.25 + ******************************************************************************/ + +#ifndef __SV_TASK_H +#define __SV_TASK_H + +void su_enter_critical (void); +void su_exit_critical (void); +void *su_return_voidptr (void *p); +void su_task_scheduling (void); +void su_taskpri_scheduling(s_tasknode_tsp node); +s_ecode_t su_startup_task (s_taskhand_tsp hand, s_u8_t status); +s_ecode_t su_suspend_task (s_tasknode_tsp node); +s_ecode_t su_resume_task (s_tasknode_tsp node); +s_ecode_t su_resume_suspend (s_tasknode_tsp node); +s_ecode_t su_delete_task (s_tasknode_tsp node); +s_ecode_t su_set_taskpri (s_tasknode_tsp node, s_u8_t pri); +s_ecode_t su_set_block (s_tasknode_tsp node, s_delay_t tick); +s_ecode_t su_clear_block (s_tasknode_tsp node); +void su_delay (s_delay_t tick); +s_bool_t su_take_mutex (s_mutex_tsp mut, s_delay_t tick); +void su_back_mutex (s_mutex_tsp mut); +s_bool_t su_take_binary (s_binary_tsp bin, s_delay_t tick, s_bool_t type); +void su_give_binary (s_binary_tsp bin); +void su_back_binary (s_binary_tsp bin); +s_bool_t su_take_semaphore (s_semaph_tsp sem, s_delay_t tick); +void su_give_semaphore (s_semaph_tsp sem); +void su_back_semaphore (s_semaph_tsp sem); +s_bool_t su_recv_taskmsg (m_taskmsg_t _OBJ_MEM_ *nmf, s_delay_t tick); +m_fetion_t su_recv_fetion (s_fetion_tsp fet, s_delay_t tick); +s_bool_t su_recv_mail (s_mailbox_tsp gm, s_delay_t tick); +void su_send_mail (s_mailbox_tsp gm, void *lm, size_t size); +void *su_recv_msg (s_msgqueue_tsp queue, s_delay_t tick); +s_ecode_t su_send_msg (s_msgqueue_tsp queue, void *msg); +s_bool_t su_query_group (void _OBJ_MEM_ *p, s_u8_t size); +s_bool_t su_wait_group (void _OBJ_MEM_ *p, s_u8_t size, s_delay_t tick); + +s_bool_t su_init_mempool (s_thrmem_tsp p, size_t size); +void _MALLOC_MEM_ *su_talloc (s_thrmem_tsp p, size_t size); +void _MALLOC_MEM_ *su_xalloc (void _MALLOC_MEM_ *p); + + + +/* + * 任务 + */ + +/* 任务优先级调度 */ +#define sUSV_TaskPriScheduling(node) su_taskpri_scheduling(node) + +/* 启动任务 */ +#define sUSV_StartTask(hand, status) \ +( \ + (m_boolvoid_tf(su_enter_critical))() || true ? su_startup_task(hand, !status ? OS_STATUS_READY : OS_STATUS_SUSPENDED) : false \ +) + +/* 挂起任务 */ +#define sUSV_SuspendTask(node) \ +( \ + (m_boolvoid_tf(su_enter_critical))() || true ? su_suspend_task(node) : false \ +) + +/* 恢复任务 */ +#define sUSV_ResumeTask(node) \ +( \ + (m_boolvoid_tf(su_enter_critical))() || true ? su_resume_task(node) : false \ +) + +/* 恢复指定任务并挂起自身任务 */ +#define sUSV_ResumeSuspend(node) \ +( \ + (m_boolvoid_tf(su_enter_critical))() || true ? su_resume_suspend(node) : false \ +) + +/* 删除任务 */ +#define sUSV_DeleteTask(node) \ +( \ + (m_boolvoid_tf(su_enter_critical))() || true ? su_delete_task(node) : false \ +) + +/* 设置任务优先级 */ +#define sUSV_SetTaskPri(node, pri) \ +( \ + (m_boolvoid_tf(su_enter_critical))() || true ? su_set_taskpri(node, pri) : false \ +) + +/* 设置阻塞(时间)*/ +#define sUSV_SetBlock(node, tc) \ +( \ + (m_boolvoid_tf(su_enter_critical))() || true ? su_set_block(node, tc) : false \ +) + +/* 清除阻塞(状态)*/ +#define sUSV_ClearBlock(node) \ +( \ + (m_boolvoid_tf(su_enter_critical))() || true ? su_clear_block(node) : false \ +) + +/* 自身任务延时 */ +#define sUSV_Delay(tc) \ +do{ \ + uEnterCritical; \ + su_delay(tc); \ +}while(false) + + + +/* + * 定时 + */ + +/* 定时中断 */ +#define sUSV_TimInt(tmid, tc) \ +do{ \ + uEnterCritical; \ + s_timint_loader[tmid] = s_timint_reload[tmid] = tc; \ + uExitCritical; \ +}while(false) + +/* 定时查询 */ +#define sUSV_TimQry(tmid, tc) \ +do{ \ + uEnterCritical; \ + s_timqry_loader[tmid] = s_timqry_reload[tmid] = tc; \ + uExitCritical; \ +}while(false) + + + +/* + * 互斥信号量 + */ + +/* 获取 */ +#define sUSV_TakeMut(mut, tc) \ +( \ + (m_boolvoid_tf(su_enter_critical))() || true ? su_take_mutex(&mut, tc) : false \ +) + +/* 归还 */ +#define sUSV_BackMut(mut) \ +do{ \ + uEnterCritical; \ + su_back_mutex(&mut); \ +}while(false) + + + +/* + * 二值信号量 + */ + +/* 等待 */ +#define sUSV_WaitBin(bin, tc) \ +( \ + (m_boolvoid_tf(su_enter_critical))() || true ? su_take_binary(&bin, tc, 0) : false \ +) + +/* 获取 */ +#define sUSV_TakeBin(bin, tc) \ +( \ + (m_boolvoid_tf(su_enter_critical))() || true ? su_take_binary(&bin, tc, 1) : false \ +) + +/* 给予 */ +#define sUSV_GiveBin(bin) \ +do{ \ + uEnterCritical; \ + su_give_binary(&bin); \ +}while(false) + +/* 归还 */ +#define sUSV_BackBin(bin) \ +do{ \ + uEnterCritical; \ + su_back_binary(&bin); \ +}while(false) + + + +/* + * 计数信号量 + */ + +/* 获取 */ +#define sUSV_TakeSem(sem, tc) \ +( \ + (m_boolvoid_tf(su_enter_critical))() || true ? su_take_semaphore(&sem, tc) : false \ +) + +/* 给予 */ +#define sUSV_GiveSem(sem) \ +do{ \ + uEnterCritical; \ + su_give_semaphore(&sem); \ +}while(false) + +/* 归还 */ +#define sUSV_BackSem(sem) \ +do{ \ + uEnterCritical; \ + su_back_semaphore(&sem); \ +}while(false) + + + +/* + * 私信 + */ + +/* 接收私信 */ +#define sUSV_RecvTaskMsg(tc) \ +( \ + (m_boolvoid_tf(su_enter_critical))() || true \ + ? su_recv_taskmsg(&m0_, tc) \ + ? s_memcpy(&m0 + 1, &m0_ + 1, MCUCFG_TASKMSG_SIZE) || true \ + ? (m_boolvoid_tf(su_exit_critical))() || true \ + : (m_boolvoid_tf(su_exit_critical))() || true \ + : false \ + : false \ +) + +/* 发送私信 */ +#define sUSV_SendTaskMsg(task) \ + uEnterCritical; \ + s_sign_send_taskmsg = true; \ + MCUCFG_TASKMSG_PSP; \ + s_scheduling_taskmsg(sTaskNode(&u_taskhand_##task)); \ + task(MCUCFG_TASKMSG_VAL, + + + +/* + * 飞信 + */ + +/* 接收飞信 */ +#define sUSV_RecvFetion(tbox, tc) \ +( \ + (m_boolvoid_tf(su_enter_critical))() || true ? su_recv_fetion(&tbox, tc) : false \ +) + +/* 发送飞信 */ +#define sUSV_SendFetion(tbox, tion) \ +do{ \ + uEnterCritical; \ + tbox.fetion = tion; \ + if(!s_sign_scheduling) s_scheduling_notnull(tbox.node); \ + uExitCritical; \ +}while(false) + + + +/* + * 消息邮箱 + */ + +/* 接收邮件 */ +#define sUSV_RecvMail(mail, mbox, tc) \ +( \ + (m_boolvoid_tf(su_enter_critical))() || true \ + ? su_recv_mail((s_mailbox_tsp)&mbox, tc) \ + ? s_memcpy(mail, &mbox.mail0, sizeof(mbox.mail0)) || true \ + ? (m_boolvoid_tf(su_exit_critical))() || true \ + : (m_boolvoid_tf(su_exit_critical))() || true \ + : false \ + : false \ +) + +/* 发送邮件 */ +#define sUSV_SendMail(mbox, mail) \ +do{ \ + uEnterCritical; \ + su_send_mail((s_mailbox_tsp)&mbox, mail, sizeof(mbox.mail0)); \ +}while(false) + + + +/* + * 消息队列 + */ + +/* 接收消息 */ +#define sUSV_RecvMsg(que, tc) \ +( \ + (m_boolvoid_tf(su_enter_critical))() || true ? su_recv_msg(que, tc) : NULL \ +) + +/* 发送消息 */ +#define sUSV_SendMsg(que, msg) \ +( \ + (m_boolvoid_tf(su_enter_critical))() || true ? su_send_msg(que, msg) : false \ +) + + + +/* + * 事件标志组 + */ + +/* 查询标志组 */ +#define sUSV_QueryFlagGroup(group) \ +( \ + (m_boolvoid_tf(su_enter_critical))() || true ? su_query_group((void *)&group, sizeof(group)) : false \ +) + +/* 等待标志组 */ +#define sUSV_WaitFlagGroup(group, tc) \ +( \ + (m_boolvoid_tf(su_enter_critical))() || true ? su_wait_group((void *)&group, sizeof(group), tc) : false \ +) + +/* 清除标志组 */ +#define sUSV_ClearFlagGroup(group) \ +do{ \ + uEnterCritical; \ + sizeof(group) == 1 ? *(s_u8_t *)&group = false : OS_NOPx1; \ + sizeof(group) == 2 ? *(s_u16_t *)&group = false : OS_NOPx1; \ + sizeof(group) == 4 ? *(s_u32_t *)&group = false : OS_NOPx1; \ + uExitCritical; \ +}while(false) + +/* 写标志位 */ +#define sUSV_WriteFlagBit(group, bit, value) \ +do{ \ + uEnterCritical; \ + group.bit = value; \ + uExitCritical; \ +}while(false) + + + +/* + * 软件RTC + */ + +/* 获取时间 */ +#define sUSV_GetTime(t) \ +( \ + (m_boolvoid_tf(su_enter_critical))() || true ? su_return_voidptr(s_memcpy(t, s_rtc[0], sizeof(s_rtc[0]))) : NULL \ +) + +/* 设置时间 */ +#define sUSV_SetTime(t) \ +do{ \ + uEnterCritical; \ + s_memcpy(s_rtc[0], t, sizeof(s_rtc[0])); \ + uUpdateCopy_GVar(s_memcpy(s_rtc[1], s_rtc[0], sizeof(s_rtc[0]))); \ + uExitCritical; \ +}while(false) + + + +/* + * 进程内存 + */ + +/* malloc */ +#define sUSV_Malloc(size) \ +( \ + (m_boolvoid_tf(su_enter_critical))() || true ? su_xalloc(s_malloc(size)) : NULL \ +) + +/* calloc */ +#define sUSV_Calloc(nmemb, size) \ +( \ + (m_boolvoid_tf(su_enter_critical))() || true ? su_xalloc(s_calloc(nmemb, size)) : NULL \ +) + +/* realloc */ +#define sUSV_Realloc(p, size) \ +( \ + (m_boolvoid_tf(su_enter_critical))() || true ? su_xalloc(s_realloc(p, size)) : NULL \ +) + +/* free */ +#define sUSV_Free(p) \ +do{ \ + uEnterCritical; \ + s_free(p); \ + uExitCritical; \ +}while(false) + + + +/* + * 线程内存 + */ + +/* 初始化线程内存池 */ +#define sUSV_InitMempool(size) \ +( \ + (m_boolvoid_tf(su_enter_critical))() || true ? su_init_mempool(&u_thrmem, size) : false \ +) + +/* 线程内存分配 */ +#define sUSV_Talloc(size) \ +( \ + (m_boolvoid_tf(su_enter_critical))() || true ? su_xalloc(su_talloc(&u_thrmem, size)) : NULL \ +) + +/* 释放线程内存池 */ +#define sUSV_FreeMempool \ +do{ \ + sUSV_Free(u_thrmem.head); \ + u_thrmem.head = u_thrmem.move = NULL; \ +}while(false) + + + +#endif diff --git a/System/ur_api.h b/System/ur_api.h new file mode 100644 index 0000000..acecacd --- /dev/null +++ b/System/ur_api.h @@ -0,0 +1,683 @@ +/**************************************************************************//** + * @item CosyOS-II Kernel + * @file ur_api.h + * @brief 用户API(创建API、任务API、滴答API、中断API、公共API) + * @author 迟凯峰 + * @version V1.3.1 + * @date 2024.01.25 + ******************************************************************************/ + +#ifndef __UR_API_H +#define __UR_API_H + + + +/* + * 声明任务 + */ + +/* 无私信 */ +#define uExternTask(task) \ + sCSV_ExternTask(task) + +/* 有私信 */ +#define uExternTask_Msg(task) \ + sCSV_ExternTask_Msg(task) /**< \taskmsg\params ...) >*/ + + + +/* + * 创建任务 + */ + +/* 创建一般任务 */ +#define uCreateTask(task, pri, tss, srt, ntm) \ + sCSV_CreateTask(task, pri, tss, srt, ntm) /**[ \taskmsg\params (...) ]*//**< \taskcode {...} >*/ + +/* 创建定时中断任务 */ +#define uCreateTask_TimInt(tmid, arl, task, pri, tss, srt, ntm) \ + sCSV_CreateTask_TimInt(tmid, arl, task, pri, tss, srt, ntm) /**[ \taskmsg\params (...) ]*//**< \taskcode {...} >*/ + +/* 创建定时查询任务 */ +#define uCreateTask_TimQry(tmid, event, arl, task, pri, tss, srt, ntm) \ + sCSV_CreateTask_TimQry(tmid, event, arl, task, pri, tss, srt, ntm) /**[ \taskmsg\params (...) ]*//**< \taskcode {...} >*/ + + + +/* + * 创建钩子 + */ + +/* 创建定时中断钩子 */ +#define uCreateHook_TimInt(tmid, arl, hook) \ + sCSV_CreateHook_TimInt(tmid, arl, hook) /**< \hookcode {...} >*/ + +/* 创建定时查询钩子 */ +#define uCreateHook_TimQry(tmid, event, arl, hook) \ + sCSV_CreateHook_TimQry(tmid, event, arl, hook) /**< \hookcode {...} >*/ + + + +/* + * 启动任务 + */ + +/* 启动任务 */ +#define uStartTask(task, status) sUSV_StartTask(&u_taskhand_##task, status) /** \return ecode */ + +/* 启动任务并就绪 */ +#define uStartTask_Ready(task) sUSV_StartTask(&u_taskhand_##task, OS_STATUS_READY) /** \return ecode */ + +/* 启动任务并挂起 */ +#define uStartTask_Suspend(task) sUSV_StartTask(&u_taskhand_##task, OS_STATUS_SUSPENDED) /** \return ecode */ + + + +/* + * 操作任务 + */ + +/* 恢复任务 */ +#define uResumeTask(task) sUSV_ResumeTask(sTaskNode(&u_taskhand_##task)) /** \return ecode */ +#define tResumeTask(task) sTSV_ResumeTask(sTaskNode(&u_taskhand_##task)) /** \return ecode */ +#define iResumeTask(task) sPSV_ResumeTask(sTaskNode(&u_taskhand_##task)) + +/* 挂起任务 */ +#define uSuspendTask(task) sUSV_SuspendTask(sTaskNode(&u_taskhand_##task)) /** \return ecode */ +#define tSuspendTask(task) sTSV_SuspendTask(sTaskNode(&u_taskhand_##task)) /** \return ecode */ +#define iSuspendTask(task) sPSV_SuspendTask(sTaskNode(&u_taskhand_##task)) + +/* 删除任务 */ +#define uDeleteTask(task) sUSV_DeleteTask(sTaskNode(&u_taskhand_##task)) /** \return ecode */ +#define tDeleteTask(task) sTSV_DeleteTask(sTaskNode(&u_taskhand_##task)) /** \return ecode */ +#define iDeleteTask(task) sPSV_DeleteTask(sTaskNode(&u_taskhand_##task)) + +/* 设置任务优先级 */ +#define uSetTaskPri(task, pri) sUSV_SetTaskPri(sTaskNode(&u_taskhand_##task), pri) /** \return ecode */ +#define tSetTaskPri(task, pri) sTSV_SetTaskPri(sTaskNode(&u_taskhand_##task), pri) /** \return ecode */ +#define iSetTaskPri(task, pri) sPSV_SetTaskPri(sTaskNode(&u_taskhand_##task), pri) + + + +/* + * 操作自身任务 + */ + +/* 设置自身任务优先级 */ +#define uSetTaskingPri(pri) sUSV_SetTaskPri(s_task_current, pri) /** \return ecode */ + +/* 挂起自身任务 */ +#define uSuspendTasking sUSV_SuspendTask(s_task_current) /** \return ecode */ + +/* 删除自身任务 */ +#define uDeleteTasking sUSV_DeleteTask(s_task_current) /** \return ecode */ + +/* 恢复指定任务并挂起自身任务 */ +#define uResumeSuspend(task) sUSV_ResumeSuspend(sTaskNode(&u_taskhand_##task)) /** \return ecode */ + +/* 结束自身任务 */ +#define uEndTasking }while(true) + + + +/* + * 设置阻塞(时间) + */ + +/* 滴答周期 */ +#define uSetBlock_tc(task, tc) sUSV_SetBlock(sTaskNode(&u_taskhand_##task), tc) /** \return ecode */ +#define tSetBlock_tc(task, tc) sTSV_SetBlock(sTaskNode(&u_taskhand_##task), tc) /** \return ecode */ +#define iSetBlock_tc(task, tc) sPSV_SetBlock(sTaskNode(&u_taskhand_##task), tc) + +/* 毫秒 */ +#define uSetBlock_ms(task, ms) uSetBlock_tc(task, (1000UL * ms) / SYSCFG_SYSTICKCYCLE) /** \return ecode */ +#define tSetBlock_ms(task, ms) tSetBlock_tc(task, (1000UL * ms) / SYSCFG_SYSTICKCYCLE) /** \return ecode */ +#define iSetBlock_ms(task, ms) iSetBlock_tc(task, (1000UL * ms) / SYSCFG_SYSTICKCYCLE) + +/* 秒钟 */ +#define uSetBlock_s(task, s) uSetBlock_ms(task, 1000UL * s) /** \return ecode */ +#define tSetBlock_s(task, s) tSetBlock_ms(task, 1000UL * s) /** \return ecode */ +#define iSetBlock_s(task, s) iSetBlock_ms(task, 1000UL * s) + +/* 分钟 */ +#define uSetBlock_m(task, m) uSetBlock_s(task, 60UL * m) /** \return ecode */ +#define tSetBlock_m(task, m) tSetBlock_s(task, 60UL * m) /** \return ecode */ +#define iSetBlock_m(task, m) iSetBlock_s(task, 60UL * m) + +/* 小时 */ +#define uSetBlock_h(task, h) uSetBlock_m(task, 60UL * h) /** \return ecode */ +#define tSetBlock_h(task, h) tSetBlock_m(task, 60UL * h) /** \return ecode */ +#define iSetBlock_h(task, h) iSetBlock_m(task, 60UL * h) + + + +/* + * 清除阻塞(状态) + */ + +#define uClearBlock(task) sUSV_ClearBlock(sTaskNode(&u_taskhand_##task)) /** \return ecode */ +#define tClearBlock(task) sTSV_ClearBlock(sTaskNode(&u_taskhand_##task)) /** \return ecode */ +#define iClearBlock(task) sPSV_ClearBlock(sTaskNode(&u_taskhand_##task)) + + + +/* + * 自身任务延时 + */ + +/* 延时滴答周期 */ +#define uDelay_tc(tc) sUSV_Delay(tc) + +/* 延时毫秒 */ +#define uDelay_ms(ms) uDelay_tc((1000UL * ms) / SYSCFG_SYSTICKCYCLE) + +/* 延时秒钟 */ +#define uDelay_s(s) uDelay_ms(1000UL * s) + +/* 延时分钟 */ +#define uDelay_m(m) uDelay_s(60UL * m) + +/* 延时小时 */ +#define uDelay_h(h) uDelay_m(60UL * h) + + + +/* + * 定时中断 + */ + +/* 定时中断滴答周期 */ +#define uTimInt_tc(tmid, tc) sUSV_TimInt(tmid, tc) +#define tTimInt_tc(tmid, tc) sTSV_TimInt(tmid, tc) +#define iTimInt_tc(tmid, tc) sPSV_TimInt(tmid, tc) + +/* 定时中断毫秒 */ +#define uTimInt_ms(tmid, ms) uTimInt_tc(tmid, (1000UL * ms) / SYSCFG_SYSTICKCYCLE) +#define tTimInt_ms(tmid, ms) tTimInt_tc(tmid, (1000UL * ms) / SYSCFG_SYSTICKCYCLE) +#define iTimInt_ms(tmid, ms) iTimInt_tc(tmid, (1000UL * ms) / SYSCFG_SYSTICKCYCLE) + +/* 定时中断秒钟 */ +#define uTimInt_s(tmid, s) uTimInt_ms(tmid, 1000UL * s) +#define tTimInt_s(tmid, s) tTimInt_ms(tmid, 1000UL * s) +#define iTimInt_s(tmid, s) iTimInt_ms(tmid, 1000UL * s) + +/* 定时中断分钟 */ +#define uTimInt_m(tmid, m) uTimInt_s(tmid, 60UL * m) +#define tTimInt_m(tmid, m) tTimInt_s(tmid, 60UL * m) +#define iTimInt_m(tmid, m) iTimInt_s(tmid, 60UL * m) + +/* 定时中断小时 */ +#define uTimInt_h(tmid, h) uTimInt_m(tmid, 60UL * h) +#define tTimInt_h(tmid, h) tTimInt_m(tmid, 60UL * h) +#define iTimInt_h(tmid, h) iTimInt_m(tmid, 60UL * h) + +/* 定时中断定时器自动重装载 */ +#define xTimInt_AutoReload(tmid, arl) s_timint_autoreload[tmid] = arl + + + +/* + * 定时查询 + */ + +/* 定时查询滴答周期 */ +#define uTimQry_tc(tmid, tc) sUSV_TimQry(tmid, tc) +#define tTimQry_tc(tmid, tc) sTSV_TimQry(tmid, tc) +#define iTimQry_tc(tmid, tc) sPSV_TimQry(tmid, tc) + +/* 定时查询毫秒 */ +#define uTimQry_ms(tmid, ms) uTimQry_tc(tmid, (1000UL * ms) / SYSCFG_SYSTICKCYCLE) +#define tTimQry_ms(tmid, ms) tTimQry_tc(tmid, (1000UL * ms) / SYSCFG_SYSTICKCYCLE) +#define iTimQry_ms(tmid, ms) iTimQry_tc(tmid, (1000UL * ms) / SYSCFG_SYSTICKCYCLE) + +/* 定时查询秒钟 */ +#define uTimQry_s(tmid, s) uTimQry_ms(tmid, 1000UL * s) +#define tTimQry_s(tmid, s) tTimQry_ms(tmid, 1000UL * s) +#define iTimQry_s(tmid, s) iTimQry_ms(tmid, 1000UL * s) + +/* 定时查询分钟 */ +#define uTimQry_m(tmid, m) uTimQry_s(tmid, 60UL * m) +#define tTimQry_m(tmid, m) tTimQry_s(tmid, 60UL * m) +#define iTimQry_m(tmid, m) iTimQry_s(tmid, 60UL * m) + +/* 定时查询小时 */ +#define uTimQry_h(tmid, h) uTimQry_m(tmid, 60UL * h) +#define tTimQry_h(tmid, h) tTimQry_m(tmid, 60UL * h) +#define iTimQry_h(tmid, h) iTimQry_m(tmid, 60UL * h) + +/* 定时查询定时器自动重装载 */ +#define xTimQry_AutoReload(tmid, arl) s_timqry_autoreload[tmid] = arl + + + +/* + * 互斥信号量 + */ + +/* 声明 */ +#define uExternMut(mut) \ + sCSV_ExternMut(mut) + +/* 创建 */ +#define uCreateMut(mut) \ + sCSV_CreateMut(mut) + +/* 获取 */ +#define uTakeMut(mut, tc) sUSV_TakeMut(mut, tc) /** \return result */ + +/* 归还 */ +#define uBackMut(mut) sUSV_BackMut(mut) + + + +/* + * 二值信号量 + */ + +/* 声明 */ +#define uExternBin(bin) \ + sCSV_ExternBin(bin) + +/* 创建 */ +#define uCreateBin(bin, init) \ + sCSV_CreateBin(bin, init) + +/* 上锁 */ +#define uLockBin(bin) bin.binary = false +#define tLockBin(bin) bin.binary = false +#define iLockBin(bin) sPSV_WriteBin(bin, false) + +/* 等待 */ +#define uWaitBin(bin, tc) sUSV_WaitBin(bin, tc) /** \return result */ + +/* 给予 */ +#define uGiveBin(bin) sUSV_GiveBin(bin) +#define tGiveBin(bin) bin.binary = true +#define iGiveBin(bin) sPSV_WriteBin(bin, true) + +/* 获取 */ +#define uTakeBin(bin, tc) sUSV_TakeBin(bin, tc) /** \return result */ +#define tTakeBin(bin) sTSV_TakeBin(bin) /** \return result */ +#define iTakeBin(bin) sISV_TakeBin(bin) /** \return result */ + +/* 归还 */ +#define uBackBin(bin) sUSV_BackBin(bin) +#define tBackBin(bin) bin.binary = true +#define iBackBin(bin) sISV_BackBin(bin) + + + +/* + * 计数信号量 + */ + +/* 声明 */ +#define uExternSem(sem) \ + sCSV_ExternSem(sem) + +/* 创建 */ +#define uCreateSem(sem, init, max) \ + sCSV_CreateSem(sem, init, max) + +/* 给予 */ +#define uGiveSem(sem) sUSV_GiveSem(sem) +#define tGiveSem(sem) sTSV_GiveSem(sem) +#define iGiveSem(sem) sPSV_GiveSem(sem) + +/* 获取 */ +#define uTakeSem(sem, tc) sUSV_TakeSem(sem, tc) /** \return result */ +#define tTakeSem(sem) sTSV_TakeSem(sem) /** \return result */ + +/* 归还 */ +#define uBackSem(sem) sUSV_BackSem(sem) +#define tBackSem(sem) sTSV_BackSem(sem) + + + +/* + * 私信 + */ + +/* 接收私信 */ +#define uRecvTaskMsg(tc) sUSV_RecvTaskMsg(tc) /** \return result */ + +/* 发送私信 */ +#define uSendTaskMsg(task) sUSV_SendTaskMsg(task) /**< \taskmsg\params ...) >*/ +#define tSendTaskMsg(task) sTSV_SendTaskMsg(task) /**< \taskmsg\params ...) >*/ + +/* API简化 */ +#define uRecvTM uRecvTaskMsg +#define uSendTM uSendTaskMsg +#define tSendTM tSendTaskMsg + + + +/* + * 飞信 + */ + +/* 声明信箱 */ +#define uExternFetion(tbox) \ + sCSV_ExternFetion(tbox) + +/* 创建信箱 */ +#define uCreateFetion(tbox) \ + sCSV_CreateFetion(tbox) + +/* 接收飞信 */ +#define uRecvFetion(tbox, tc) sUSV_RecvFetion(tbox, tc) /** \return fetion */ +#define tRecvFetion(tbox) sTSV_RecvFetion(tbox) /** \return fetion */ +#define iRecvFetion(tbox) sISV_RecvFetion(tbox) /** \return fetion */ + +/* 发送飞信 */ +#define uSendFetion(tbox, tion) sUSV_SendFetion(tbox, tion) +#define tSendFetion(tbox, tion) tbox.fetion = tion +#define iSendFetion(tbox, tion) sPSV_SendFetion(tbox, tion) + +/* API简化 */ +#define uRecvFet uRecvFetion +#define tRecvFet tRecvFetion +#define iRecvFet iRecvFetion +#define uSendFet uSendFetion +#define tSendFet tSendFetion +#define iSendFet iSendFetion + + + +/* + * 消息邮箱 + */ + +/* 声明邮箱 */ +#define uExternMailbox(mbox, type) \ + sCSV_ExternMailbox(mbox, type) + +/* 创建邮箱 */ +#define uCreateMailbox(mbox) \ + sCSV_CreateMailbox(mbox) + +/* 接收邮件 */ +#define uRecvMail(mail, mbox, tc) sUSV_RecvMail(mail, mbox, tc) /** \return result */ +#define tRecvMail(mail, mbox) sTSV_RecvMail(mail, mbox) /** \return result */ +#define iRecvMail(mail, mbox) sISV_RecvMail(mail, mbox) /** \return result */ + +/* 发送邮件 */ +#define uSendMail(mbox, mail) sUSV_SendMail(mbox, mail) +#define tSendMail(mbox, mail) sTSV_SendMail(mbox, mail) +#define iSendMail(mbox, mail) sPSV_SendMail(mbox, mail) + + + +/* + * 消息队列 + */ + +/* 声明静态消息队列 */ +#define uExternMsgQueue_Static(que) \ + sCSV_ExternMsgQueue_Static(que) + +/* 声明动态消息队列 */ +#define uExternMsgQueue_Dynamic(que) \ + sCSV_ExternMsgQueue_Dynamic(que) + +/* 创建静态消息队列 */ +#define uCreateMsgQueue_Static(que, mode, len) \ + sCSV_CreateMsgQueue_Static(que, mode, len) + +/* 创建动态消息队列 */ +#define uCreateMsgQueue_Dynamic(que, mode, len) \ + sCSV_CreateMsgQueue_Dynamic(que, mode, len) + +/* 接收消息 */ +#define uRecvMsg(que, tc) sUSV_RecvMsg((s_msgqueue_tsp)&que, tc) /** \return ptr */ +#define tRecvMsg(que) sTSV_RecvMsg((s_msgqueue_tsp)&que) /** \return ptr */ +#define iRecvMsg(que) sISV_RecvMsg((s_msgqueue_tsp)&que) /** \return ptr */ + +/* 发送消息 */ +#define uSendMsg(que, msg) sUSV_SendMsg((s_msgqueue_tsp)&que, msg) /** \return ecode */ +#define tSendMsg(que, msg) sTSV_SendMsg((s_msgqueue_tsp)&que, msg) /** \return ecode */ +#define iSendMsg(que, msg) sPSV_SendMsg((s_msgqueue_tsp)&que, msg) + + + +/* + * 事件标志组 + */ + +/* 声明标志组 */ +#define uExternFlagGroup(group, bits) \ + sCSV_ExternFlagGroup(group, bits) + +/* 定义标志位 */ +#define uDefFlagBit(bit) sDefBitField(bit) + +/* 定义空位 */ +#define uDefVoidBits(nvb) sDefVoidBits(nvb) + +/* 创建标志组 */ +#define uCreateFlagGroup(group) \ + sCSV_CreateFlagGroup(group) /**[ \init = {...} ]*/ + +/* 等待标志组 */ +#define uWaitFlagGroup(group, tc) sUSV_WaitFlagGroup(group, tc) /** \return result */ + +/* 查询标志组 */ +#define uQueryFlagGroup(group) sUSV_QueryFlagGroup(group) /** \return result */ +#define tQueryFlagGroup(group) sTSV_QueryFlagGroup(group) /** \return result */ +#define iQueryFlagGroup(group) sISV_QueryFlagGroup(group) /** \return result */ + +/* 清除标志组 */ +#define uClearFlagGroup(group) sUSV_ClearFlagGroup(group) +#define tClearFlagGroup(group) sTSV_ClearFlagGroup(group) +#define iClearFlagGroup(group) sPSV_ClearFlagGroup(group) + +/* 查询标志位(任务、滴答、中断中,均直接查询)*/ + +/* 设置标志位(滴答中直接设置,任务中也可在任务临界区中设置)*/ +#define uSetFlagBit(group, bit) sUSV_WriteFlagBit(group, bit, true) +#define iSetFlagBit(group, bit) iSetFlagBits(group, 1) bit) + +/* 清除标志位(滴答中直接清除,任务中也可在任务临界区中清除)*/ +#define uClearFlagBit(group, bit) sUSV_WriteFlagBit(group, bit, false) +#define iClearFlagBit(group, bit) iClearFlagBits(group, 1) bit) + +/* 设置多标志位(滴答中直接设置,任务中在任务临界区中设置)*/ +#define iSetFlagBits(group, nbit) sPSV_WriteFlagBits(group, +, nbit) /**< \bits ...) >*/ + +/* 清除多标志位(滴答中直接清除,任务中在任务临界区中清除)*/ +#define iClearFlagBits(group, nbit) sPSV_WriteFlagBits(group, -, nbit) /**< \bits ...) >*/ + + + +/* + * 全局变量访问 + */ + +/* 更新全局变量副本 */ +#define uUpdateCopy(code) sUpdateCopy(code) +#define tUpdateCopy(code) sUpdateCopy(code) + +/* 读哪一个全局变量?(返回0读正本,返回1读副本)*/ +#define iWhichGVarToRead !s_sign_updatecopy /** \return bool */ + +/* 写全局变量 */ +#define iWriteGVar(gv, lv) sPSV_WriteGVar((void *)&gv, (void *)&lv, sizeof(gv)) + +/* 写全局数组 */ +#define iWriteGAry(gp, lp, size) sPSV_WriteGVar(gp, lp, size) + +/* 写全局字符串 */ +#define iWriteGStr(gs, ls) sPSV_WriteGVar(gs, ls, 0) + +/* 挂起服务调用 */ +#define iPendSVC(fp) sPSV_PendSVC(fp) + +/* 发送信号 */ +#define iSendSign(sign) sPSV_SendSign(sign) + + + +/* + * 软件RTC + */ + +/* 获取时间 */ +#define uGetTime(t) sUSV_GetTime(t) /** \return t */ +#define tGetTime(t) sTSV_GetTime(t) /** \return t */ +#define iGetTime(t) sISV_GetTime(t) /** \return t */ + +/* 设置时间 */ +#define uSetTime(t) sUSV_SetTime(t) +#define tSetTime(t) sTSV_SetTime(t) +#define iSetTime(t) sPSV_SetTime(t) + + + +/* + * 进程内存 + */ + +/* malloc */ +#define uMalloc(size) sUSV_Malloc(size) /** \return ptr */ + +/* calloc */ +#define uCalloc(nmemb, size) sUSV_Calloc(nmemb, size) /** \return ptr */ + +/* realloc */ +#define uRealloc(p, size) sUSV_Realloc(p, size) /** \return ptr */ + +/* free */ +#define uFree(p) sUSV_Free(p) + + + +/* + * 线程内存 + */ + +/* 创建线程内存池 */ +#define uCreateMempool sCSV_CreateMempool + +/* 初始化线程内存池 */ +#define uInitMempool(size) sUSV_InitMempool(size) /** \return result */ + +/* 线程内存分配 */ +#define uTalloc(size) sUSV_Talloc(size) /** \return ptr */ + +/* 释放线程内存池 */ +#define uFreeMempool sUSV_FreeMempool + + + +/* + * DEBUG + */ + +#define iDebugSend iTimQry_ms(OS_TMID_DEBUGHOOK, 30) +#define iDebugRecv iTimInt_ms(OS_TMID_DEBUGGER, 15) + +#if false +/* 应用示例 - 8051/80251 UART1 */ +void UART1_Isr(void) interrupt 4 +{ + if(TI){ + TI = 0; + if(*s_debug_sendptr){ + SBUF = *s_debug_sendptr++; + } + else{ + iDebugSend; + } + } + if(RI){ + RI = 0; + if(s_debug_recvptr - s_debug_recvbuff < OS_DEBUGRECVBUFFSIZE - 1){ + *s_debug_recvptr++ = SBUF; + } + iDebugRecv; + } +} + +/* 应用示例 - STM32 USART1 */ +void USART1_IRQHandler(void) +{ + if(USART_GetITStatus(USART1, USART_IT_TXE) != RESET){ + if(*s_debug_sendptr){ + USART_SendData(USART1, *s_debug_sendptr++); + } + else{ + USART_ITConfig(USART1, USART_IT_TXE, DISABLE); + iDebugSend; + } + } + if(USART_GetITStatus(USART1, USART_IT_RXNE) != RESET){ + if(s_debug_recvptr - s_debug_recvbuff < OS_DEBUGRECVBUFFSIZE - 1){ + *s_debug_recvptr++ = USART_ReceiveData(USART1); + } + iDebugRecv; + } +} + +#endif + + + +/* + * 任务调度 + * 由用户手动触发的临时性的任务调度 + */ + +/* 无条件任务调度 */ +#define uTaskScheduling su_task_scheduling() +#define iTaskScheduling si_task_scheduling() + +/* 任务优先级调度 */ +#define uTaskPriScheduling(task) sUSV_TaskPriScheduling(sTaskNode(&u_taskhand_##task)) +#define iTaskPriScheduling(task) sISV_TaskPriScheduling(sTaskNode(&u_taskhand_##task)) + + + +/* + * 任务临界区 + * 任务级的临界区保护,仅关闭SysTick、PendSV,仅支持在任务中调用。 + */ + +/* 进入临界区 */ +#define uEnterCritical su_enter_critical() + +/* 退出临界区 */ +#define uExitCritical su_exit_critical() + + + +/* + * 全局临界区 + * 系统级的临界区保护,通常会关闭总中断,支持在任意处调用。 + * CosyOS内核中从来不会进入全局临界区,提供此项服务只是为了便于用户对全局公共资源和程序过程的保护。 + */ + +/* [ARM] */#if MCUCFG_ISA == __ARM__ + +/* 方法一:操作PRIMASK */ +#define xDisableIRQ mxDisableIRQ /* 进入全局临界区 *//** \return oldirq */ +#define xResumeIRQ(oldirq) mxResumeIRQ(oldirq) /* 退出全局临界区 */ + +/* 方法二:操作FAULTMASK */ +#define xDisableFIQ mxDisableFIQ /* 进入全局临界区 *//** \return oldfiq */ +#define xResumeFIQ(oldfiq) mxResumeFIQ(oldfiq) /* 退出全局临界区 */ + +/* 方法三:操作BASEPRI */ +#define xMaskingPRI(newpri) mxMaskingPRI(newpri) /* 进入全局临界区 *//** \return oldpri */ +#define xResumePRI(oldpri) mxResumePRI(oldpri) /* 退出全局临界区 */ + +/* [!ARM] */#else + +/* 操作EA */ +#define xDisableIRQ mxDisableIRQ /* 进入全局临界区 */ +#define xResumeIRQ mxResumeIRQ /* 退出全局临界区 */ + +#endif + + + +#endif