4323|5

27

帖子

0

TA的资源

一粒金砂(中级)

楼主
 

关于在nios下运行ucos的问题!! [复制链接]

 我写的代码如下,定时器是每200US发信号量给任务,然后任务是改变PWM的输出频率。但是我在示波器下观察,发现时没有波形输出的?请问是什么原因?

#define   TASK_STACKSIZE       2048
OS_STK    task1_stk[TASK_STACKSIZE];

#define TASK1_PRIORITY      4

OS_EVENT *sem;

typedef struct
{
    volatile unsigned int divi;
    volatile unsigned int duty;
    volatile unsigned int enable;
}PWM;


unsigned int divi_1[3]={5000,3000,2000};
unsigned int duty_1[3]={2500,1500,1000};

static void ISR_timer1(void *context, alt_u32 id)
{
    IOWR_ALTERA_AVALON_TIMER_STATUS(TIMER1_BASE, 0x00);
   
OSSemPost(sem);
}

void task1(void* pdata)
{
  INT8U i,err;
  PWM *pwm = (PWM *)PWM_0_NAME;
  

  OS_CPU_SR cpu_sr;
  sem=OSSemCreate(0);
//初始化定时器,200US中断一次  
IOWR_ALTERA_AVALON_TIMER_STATUS(TIMER1_BASE, 0x00);                  
IOWR_ALTERA_AVALON_TIMER_PERIODL(TIMER1_BASE,20000);
  IOWR_ALTERA_AVALON_TIMER_PERIODH(TIMER1_BASE,20000>> 16);
  IOWR_ALTERA_AVALON_TIMER_CONTROL(TIMER1_BASE, 0x07);
//注册中断函数  
alt_irq_register(TIMER1_IRQ, (void *)TIMER1_BASE, ISR_timer1);
  
  while(1)
  {
      for(i=0;i<3;i++)
     {
         OSSemPend(sem,0,&err);
         OS_ENTER_CRITICAL();
//改变PWM的占空比         
pwm->divi=divi_1;
         pwm->duty=duty_1;
         pwm->enable = 1;                          
         OS_EXIT_CRITICAL();     
      }
      
  }            
}

int main(void)
{
  
  OSTaskCreateExt(task1,
                  NULL,
                  (void *)&task1_stk[TASK_STACKSIZE-1],
                  TASK1_PRIORITY,
                  TASK1_PRIORITY,
                  task1_stk,
                  TASK_STACKSIZE,
                  NULL,
                  0);                     
  OSStart();
  return 0;
}

最新回复

在POST的时候会调用OS_Sched,但是请看源码,在中断服务程序ISR中OS_Sched判断到OSIntNesting != 0u,就不会做任务切换了,而将任务切换留给OSIntExit来执行的 void  OS_Sched (void) { #if OS_CRITICAL_METHOD == 3u                           /* Allocate storage for CPU status register     */     OS_CPU_SR  cpu_sr = 0u; #endif     OS_ENTER_CRITICAL();     if (OSIntNesting == 0u) {                          /* Schedule only if all ISRs done and ...       */         if (OSLockNesting == 0u) {                     /* ... scheduler is not locked                  */             OS_SchedNew();             OSTCBHighRdy = OSTCBPrioTbl[OSPrioHighRdy];             if (OSPrioHighRdy != OSPrioCur) {          /* No Ctx Sw if current task is highest rdy     */ #if OS_TASK_PROFILE_EN > 0u                 OSTCBHighRdy->OSTCBCtxSwCtr++;         /* Inc. # of context switches to this task      */ #endif                 OSCtxSwCtr++;                          /* Increment context switch counter             */                 OS_TASK_SW();                          /* Perform a context switch                     */             }         }     }     OS_EXIT_CRITICAL(); }  详情 回复 发表于 2013-12-12 10:49
点赞 关注
 

回复
举报

1059

帖子

0

TA的资源

纯净的硅(高级)

沙发
 
debug看task进去没进去 进去的话就是avalon总线到IO连接问题

点评

我单步运行时,它有进去的。而且PWM的值是有改变。 IO接口没问题的。  详情 回复 发表于 2013-12-7 10:35
 
 
 

回复

112

帖子

0

TA的资源

一粒金砂(高级)

板凳
 
static void ISR_timer1(void *context, alt_u32 id)
{
    IOWR_ALTERA_AVALON_TIMER_STATUS(TIMER1_BASE, 0x00);
   
OSSemPost(sem);
}

没有OSINTENTER及OSINTEXIT

点评

可是OSSemPost不是可以进行任务切换的吗?  详情 回复 发表于 2013-12-7 10:32
 
个人签名淘宝小店:http://brightpoint.taobao.com
 
 

回复

27

帖子

0

TA的资源

一粒金砂(中级)

4
 

回复 板凳llpanda 的帖子

可是OSSemPost不是可以进行任务切换的吗?

点评

在POST的时候会调用OS_Sched,但是请看源码,在中断服务程序ISR中OS_Sched判断到OSIntNesting != 0u,就不会做任务切换了,而将任务切换留给OSIntExit来执行的 void OS_Sched (void) { #if OS_CRITICAL_METHOD  详情 回复 发表于 2013-12-12 10:49
 
 
 

回复

27

帖子

0

TA的资源

一粒金砂(中级)

5
 

回复 沙发astwyg 的帖子

我单步运行时,它有进去的。而且PWM的值是有改变。
IO接口没问题的。
 
 
 

回复

112

帖子

0

TA的资源

一粒金砂(高级)

6
 

回复 4楼guaiguaidou 的帖子

在POST的时候会调用OS_Sched,但是请看源码,在中断服务程序ISR中OS_Sched判断到OSIntNesting != 0u,就不会做任务切换了,而将任务切换留给OSIntExit来执行的
void  OS_Sched (void)
{
#if OS_CRITICAL_METHOD == 3u                           /* Allocate storage for CPU status register     */
    OS_CPU_SR  cpu_sr = 0u;
#endif



    OS_ENTER_CRITICAL();
    if (OSIntNesting == 0u) {                          /* Schedule only if all ISRs done and ...       */
        if (OSLockNesting == 0u) {                     /* ... scheduler is not locked                  */
            OS_SchedNew();
            OSTCBHighRdy = OSTCBPrioTbl[OSPrioHighRdy];
            if (OSPrioHighRdy != OSPrioCur) {          /* No Ctx Sw if current task is highest rdy     */
#if OS_TASK_PROFILE_EN > 0u
                OSTCBHighRdy->OSTCBCtxSwCtr++;         /* Inc. # of context switches to this task      */
#endif
                OSCtxSwCtr++;                          /* Increment context switch counter             */
                OS_TASK_SW();                          /* Perform a context switch                     */
            }
        }
    }
    OS_EXIT_CRITICAL();
}
 
个人签名淘宝小店:http://brightpoint.taobao.com
 
 

回复
您需要登录后才可以回帖 登录 | 注册

随便看看
查找数据手册?

EEWorld Datasheet 技术支持

相关文章 更多>>
关闭
站长推荐上一条 1/10 下一条

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

About Us 关于我们 客户服务 联系方式 器件索引 网站地图 最新更新 手机版

站点相关: 国产芯 安防电子 汽车电子 手机便携 工业控制 家用电子 医疗电子 测试测量 网络通信 物联网

北京市海淀区中关村大街18号B座15层1530室 电话:(010)82350740 邮编:100190

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved
快速回复 返回顶部 返回列表