导航:首页 > 网络营销 > sempend

sempend

发布时间:2020-08-24 22:51:32

1、什么是互斥反应技术?

信号量的处理核心原则在于,如果任务能获得信号量则返回成功,如果获取不到,则任务按照优先级挂载到的pend列表,等待信号量释放,或者等待超时时间到自动唤醒,或者立马及时上报获取错误。

与信号量相比,mutex的区别主要在于:

(1)mutex的获取完全互斥,即同一个时刻,mutex只能被一个任务获取。

(2)信号量的释放可以由其他任务上下文进行释放,并且可以选择释放单个任务或者所有阻塞任务。mutex的释放必须占用该mutex的任务进行,其他任务进行释放,会直接返回失败。

(3)为了解决优先级反转问题,高优先级的任务获取mutex时,如果该mutex被低优先级的任务占用,会动态提升该低优先级任务的优先级至等于高的优先级。并且该优先级值依次传递给该低优先级任务的依赖的互斥量关联的任务,依次递归下去。当某任务释放mutex时,会查找该任务的基础优先级,以及获取到的互斥量所阻塞的最高优先级的任务,取其优先级的最小值,来重新设定此任务的优先级。总的原则就是,高优先级任务被mutex阻塞时,会将占用该mutex的低优先级任务的优先级临时提高;mutex被释放时,相应任务的优先级需要恢复。

2、互斥量的创建与删除

2、ucosiii源码中有多个os-app-cfg

/*
************************************************************************************************************************
* uC/OS-III
* The Real-Time Kernel
*
* (c) Copyright 2009-2011; Micrium, Inc.; Weston, FL
* All rights reserved. Protected by international copyright laws.
*
* CONFIGURATION FILE
*
* File : OS_CFG.H
* By : JJL 注释:~风中的叶~
* Version : V3.02.00
*
* LICENSING TERMS:
* ---------------
* uC/OS-III is provided in source form for FREE short-term evaluation, for ecational use or
* for peaceful research. If you plan or intend to use uC/OS-III in a commercial application/
* proct then, you need to contact Micrium to properly license uC/OS-III for its use in your
* application/proct. We provide ALL the source code for your convenience and to help you
* experience uC/OS-III. The fact that the source is provided does NOT mean that you can use
* it commercially without paying a licensing fee.
*
* Knowledge of the source code may NOT be used to develop a similar proct.
*
* Please help us continue to provide the embedded community with the finest software available.
* Your honesty is greatly appreciated.
*
* You can contact us at www.micrium.com, or by phone at +1 (954) 217-2036.
************************************************************************************************************************
*/

#ifndef OS_CFG_H
#define OS_CFG_H

/* ---------------------------- MISCELLANEOUS -------------------------- */
#define OS_CFG_APP_HOOKS_EN 1u /* Enable (1) or Disable (0) application specific hooks;HOOK功能的使能 */
#define OS_CFG_ARG_CHK_EN 1u /* Enable (1) or Disable (0) argument checking;参数检测使能(调试的时候允许)*/
#define OS_CFG_CALLED_FROM_ISR_CHK_EN 1u /* Enable (1) or Disable (0) check for called from ISR;是否允许在ISR中调用系统函数(除了POST)*/
#define OS_CFG_DBG_EN 1u /* Enable (1) debug code/variables ;debug功能允许使能(可以知道OS_TCB的大小等,调试的时候使能)*/
#define OS_CFG_ISR_POST_DEFERRED_EN 1u /* Enable (1) or Disable (0) Deferred ISR posts;使能则有短的中断延时,但是有长的ISR—to—task响应*/
#define OS_CFG_OBJ_TYPE_CHK_EN 1u /* Enable (1) or Disable (0) object type checking;对象类型检测(调试的时候允许)*/
#define OS_CFG_TS_EN 1u /* Enable (1) or Disable (0) time stamping;时间戳使能 */

#define OS_CFG_PEND_MULTI_EN 1u /* Enable (1) or Disable (0) code generation for multi-pend feature是否支持事件的多路等待功能*/

#define OS_CFG_PRIO_MAX 64u /* Defines the maximum number of task priorities (see OS_PRIO data type)任务优先级的最大数*/

#define OS_CFG_SCHED_LOCK_TIME_MEAS_EN 1u /* Include code to measure scheler lock time包含测量调度锁定时间的代码 */
#define OS_CFG_SCHED_ROUND_ROBIN_EN 1u /* Include code for Round-Robin scheling 包含轮转调度的代码 */
#define OS_CFG_STK_SIZE_MIN 64u /* Minimum allowable task stack size 最小允许的任务堆栈的大小 */

/* ----------------------------- EVENT FLAGS --------------------------- */
#define OS_CFG_FLAG_EN 1u /* Enable (1) or Disable (0) code generation for EVENT FLAGS使能事件标志的代码*/
#define OS_CFG_FLAG_DEL_EN 1u /* Include code for OSFlagDel()使能标志删除功能 */
#define OS_CFG_FLAG_MODE_CLR_EN 1u /* Include code for Wait on Clear EVENT FLAGS使能等待清除事件标志功能*/
#define OS_CFG_FLAG_PEND_ABORT_EN 1u /* Include code for OSFlagPendAbort()标志事件的等待终止功能 */

/* -------------------------- MEMORY MANAGEMENT ------------------------ */
#define OS_CFG_MEM_EN 1u /* Enable (1) or Disable (0) code generation for MEMORY MANAGER是否允许内存管理的功能*/

/* --------------------- MUTUAL EXCLUSION SEMAPHORES ------------------- */
#define OS_CFG_MUTEX_EN 1u /* Enable (1) or Disable (0) code generation for MUTEX互斥性信号量功能使能*/
#define OS_CFG_MUTEX_DEL_EN 1u /* Include code for OSMutexDel()互斥性信号量删除功能使能 */
#define OS_CFG_MUTEX_PEND_ABORT_EN 1u /* Include code for OSMutexPendAbort()互斥性信号量等待终止功能使能 */

/* --------------------------- MESSAGE QUEUES -------------------------- */
#define OS_CFG_Q_EN 1u /* Enable (1) or Disable (0) code generation for QUEUES消息队列功能使能 */
#define OS_CFG_Q_DEL_EN 1u /* Include code for OSQDel() 消息队列删除功能使能 */
#define OS_CFG_Q_FLUSH_EN 1u /* Include code for OSQFlush()消息队列刷新功能使能 */
#define OS_CFG_Q_PEND_ABORT_EN 1u /* Include code for OSQPendAbort()消息队列等待终止功能使能 */

/* ----------------------------- SEMAPHORES ---------------------------- */
#define OS_CFG_SEM_EN 1u /* Enable (1) or Disable (0) code generation for SEMAPHORES信号量功能使能*/
#define OS_CFG_SEM_DEL_EN 1u /* Include code for OSSemDel()信号量删除功能使能 */
#define OS_CFG_SEM_PEND_ABORT_EN 1u /* Include code for OSSemPendAbort()信号量等待终止功能使能 */
#define OS_CFG_SEM_SET_EN 1u /* Include code for OSSemSet()信号量置位功能使能 */

/* -------------------------- TASK MANAGEMENT -------------------------- */
#define OS_CFG_STAT_TASK_EN 1u /* Enable (1) or Disable(0) the statistics task统计功能使能 */
#define OS_CFG_STAT_TASK_STK_CHK_EN 1u /* Check task stacks from statistic task统计任务堆栈检测功能使能 */

#define OS_CFG_TASK_CHANGE_PRIO_EN 1u /* Include code for OSTaskChangePrio()改变任务优先级功能使能 */
#define OS_CFG_TASK_DEL_EN 1u /* Include code for OSTaskDel() 任务删除功能使能 */
#define OS_CFG_TASK_Q_EN 1u /* Include code for OSTaskQXXXX()任务消息队列功能使能 */
#define OS_CFG_TASK_Q_PEND_ABORT_EN 1u /* Include code for OSTaskQPendAbort()任务消息队列等待取消功能使能 */
#define OS_CFG_TASK_PROFILE_EN 1u /* Include variables in OS_TCB for profiling使能任务的详细情况功能,包括任务的切换次数,执行时间,相对于其他任务的CPU利用率*/
#define OS_CFG_TASK_REG_TBL_SIZE 1u /* Number of task specific registers任务特殊功能寄存器 */
#define OS_CFG_TASK_SEM_PEND_ABORT_EN 1u /* Include code for OSTaskSemPendAbort()任务信号量等待取消功能使能 */
#define OS_CFG_TASK_SUSPEND_EN 1u /* Include code for OSTaskSuspend() and OSTaskResume()任务暂时中止和恢复功能使能*/

/* -------------------------- TIME MANAGEMENT -------------------------- */
#define OS_CFG_TIME_DLY_HMSM_EN 1u /* Include code for OSTimeDlyHMSM()时间延时函数使能 */
#define OS_CFG_TIME_DLY_RESUME_EN 1u /* Include code for OSTimeDlyResume()时间延时取消功能使能 */

/* ------------------------- TIMER MANAGEMENT -------------------------- */
#define OS_CFG_TMR_EN 1u /* Enable (1) or Disable (0) code generation for TIMERS定时器功能使能 */
#define OS_CFG_TMR_DEL_EN 1u /* Enable (1) or Disable (0) code generation for OSTmrDel()定时器删除功能使能*/

#endif

3、请教Tong Tang有关6748 eDMA传输的问题

Tong Tang
你好!请教你有关6748的EDMA传输(pingpong )的问题。
一、我的意图
1、McASP接口实现pingpong传输
2、实现pingpong传输完成中断
二、目前近展情况:
1、McASP接口配置完成 (也是在你的帮助下实现的)
2、AIC3106 CODEC配置正常
3、CPU方式读写McASP接口工作正常(通过AudioLineIn函数能正常播放音乐)
三、部分代码说明(详细代码请看附件)
void setup_edma_pingpong_xmt(void *src_ping, void *src_pong, void *dst,
Uint32 acnt, Uint32 bcnt);//设置发送的EDMA链
void setup_edma_pingpong_rcv(void *src, void *dst_ping, void *dst_pong,
Uint32 acnt, Uint32 bcnt)//设置接收的EDMA链
// setup codec and McASP
printf("[audio TSK]: initializing audio device...");
I2C_init(I2C0, I2C_CLK_100K);
AIC3106_init();
MCASP_init();
还有一些不明白的代码也像你请教一下,我是从别的例程上看到的。
SEM_new(&xmt_ping_sem, 0);
SEM_post(&rcv_ping_sem);
SEM_pend(&rcv_ping_sem, SYS_FOREVER);
这些代码是不是有关多线程的,而且也找不到源头,究竟需要不需要这些代码呢。要是需要,我怎么用?
是不是要安装6748 BIOSPSP,我发现TI公司的edma3_lld_02_11_02_04这个文件,好像已经实现pingpong传输功能了,
只是苦于不会用,6748 BIOSPSP里面好多功能,就是不会用。有没有这方面的培训呀,我比较笨,看不懂。
四、调试情况
软件环境:CCS5.5 仿真器是合达众的560plus 片子型号:6748

4、ucosiii能移植到m0的核吗

同时使用多个内核对象
uC/OS-III 只允许同时等待多个信号量和消息队列,不能同时等待多个事件标志组或mutex。
这里写图片描述
任务接收到一个信号量或消息,就会进入就绪。任务通过调用OSPendMulti()等待多个对象。
/*1.定义OS_PEND_DATA数组*/
OS_OBJ_QTY index;
OS_PEND_DATA pend_multi_tbl[CORE_OBJ_NUM];//定义数组
/*2.放入消息队列或者信号量*/
pend_multi_tbl[0].PendObjPtr=(OS_PEND_OBJ*)&Test_Sem1;
pend_multi_tbl[1].PendObjPtr=(OS_PEND_OBJ*)&Test_Sem2;
pend_multi_tbl[2].PendObjPtr=(OS_PEND_OBJ*)&Test_Q;
/*3.等待多个内核,返回准备好,停止或者删除的内核对象数量*/
index=OSPendMulti((OS_PEND_DATA* )pend_multi_tbl,//内核对象数组
(OS_OBJ_QTY)CORE_OBJ_NUM, //内核数量
(OS_TICK)0,
(OS_OPT)OS_OPT_PEND_BLOCKING,
(OS_ERR*)&err);

5、DSP/BIOS中怎么在HWI中调用软件中断.

回复
whzbest
的帖子看来你没有好好读TI的文档资料啊。在使用DSP/BIOS,调用硬件中断时,一定要去掉main函数中的while(1)循环,这样,DSP/BIOS内核才能进行进程的调度。你的硬件中断之所以没有检测到,可能是因为你对中断的配置没有配置好。另外,要想在HWI中触发SWI,直接在HWI
ISR中使用SWI_post();即可。若要在HWI中调用TSK,需要使用SEM_post(&semaphore)

6、stm32f4 库函数 printf使用dma吗

int fputc(int ch, FILE *f)
{
OS_ERR err;
CPU_TS ts;
Dbg_printf_time[Dbg_printf_cnt++] = STK_VAL_REG; //进入函数前读取systick的寄存器值
Dbg_printf_inter[Dbg_printf_cnt] = Dbg_printf_time[Dbg_printf_cnt-2] - Dbg_printf_time[Dbg_printf_cnt-1];//用刚读取的寄存器值减去上一次退出该函数的寄存器值,从而得到两次进入该函数之间的时间
while (HAL_UART_Transmit_IT(&huart, (uint8_t *)&ch, 1) != HAL_OK)
{
OSTaskSemPend(10, OS_OPT_PEND_BLOCKING, &ts, &err);
//check “err”
}
Dbg_printf_time[Dbg_printf_cnt++] = STK_VAL_REG; //退出函数前读取systick的寄存器值
Dbg_printf_inter[Dbg_printf_cnt] = Dbg_printf_time[Dbg_printf_cnt-2] - Dbg_printf_time[Dbg_printf_cnt-1];//用刚读取的寄存器值减去进入该函数的寄存器值,从而得到两次进入该函数之间的时间
if (Dbg_printf_cnt > 90)
{
Dbg_printf_cnt = 1;
}
return ch;
}

7、DSP/BIOS中怎么在HWI中调用软件中断.

回复
whzbest
的帖子看来你没有好好读TI的文档资料啊。在使用DSP/BIOS,调用硬件中断时,一定要去掉main函数中的while(1)循环,这样,DSP/BIOS内核才能进行进程的调度。你的硬件中断之所以没有检测到,可能是因为你对中断的配置没有配置好。另外,要想在HWI中触发SWI,直接在HWI
ISR中使用SWI_post();即可。若要在HWI中调用TSK,需要使用SEM_post(&semaphore)

8、请问CCS5中SYS/BIOS有没有像DSP/BIOS的那类API?

        有的,例如System_printf,Vps_rprintf之类的,其中Vps_rprintf可以把信息输出到串口打印出来。

        旗语模块使用Semaphore_create()、Semaphore_pend()、Semaphore_post()来实现,对于SYS/BIOS API函数查询,具体可以参考附件所提供SYS/BIOS API文档。



9、stm32的DMA内存到内存模式,库函数代码!?或者设置应该注意什么?

没有多大的要求吧

这是固件库例程的代码,从SRC_Buffer向DST_Buffer的传送。注意两个数组的大小要相同。

  /* DMA1 channel6 configuration */
  DMA_DeInit(DMA1_Channel6);
  DMA_InitStructure.DMA_PeripheralBaseAddr = (uint32_t)SRC_Buffer;
  DMA_InitStructure.DMA_MemoryBaseAddr = (uint32_t)DST_Buffer;
  DMA_InitStructure.DMA_DIR = DMA_DIR_PeripheralSRC;
  DMA_InitStructure.DMA_BufferSize = BufferSize;
  DMA_InitStructure.DMA_PeripheralInc = DMA_PeripheralInc_Enable;
  DMA_InitStructure.DMA_MemoryInc = DMA_MemoryInc_Enable;
  DMA_InitStructure.DMA_PeripheralDataSize = DMA_PeripheralDataSize_Word;
  DMA_InitStructure.DMA_MemoryDataSize = DMA_MemoryDataSize_Word;
  DMA_InitStructure.DMA_Mode = DMA_Mode_Normal;
  DMA_InitStructure.DMA_Priority = DMA_Priority_High;
  DMA_InitStructure.DMA_M2M = DMA_M2M_Enable;
  DMA_Init(DMA1_Channel6, &DMA_InitStructure);

  /* Enable DMA1 Channel6 Transfer Complete interrupt */
  DMA_ITConfig(DMA1_Channel6, DMA_IT_TC, ENABLE);

  /* Get Current Data Counter value before transfer begins */
  CurrDataCounterBegin = DMA_GetCurrDataCounter(DMA1_Channel6);

 //启动传送
  DMA_Cmd(DMA1_Channel6, ENABLE);

//等待传送完成
  while (CurrDataCounterEnd != 0)
  {
  }

与sempend相关的知识