搜索
bottom↓
12
返回列表 发新帖
楼主: myxiaonia

RTX 学习笔记

  [复制链接]

出0入0汤圆

 楼主| 发表于 2014-12-2 22:29:31 | 显示全部楼层
本帖最后由 myxiaonia 于 2014-12-3 08:29 编辑
kevin_me 发表于 2014-12-2 20:35
down下来36楼的工程之后,直接编译报错了。

提示没有stm32f10x.h头文件,我自行添加之后,编译报错缺少sys ...


我也不确信这个1楼的文档还能用不,可恶的oksvn把我的项目删除了,本来你可以在那里下载。。。明天我把最近更新的项目再上传一遍吧


请使用2楼的最新上传的版本,关于你说的找不到头文件问题,此项目用的是105rb,自动包含了stm32的头文件路径,所以我不知道你为何无法找到,请使用mdk473,估计mdk5设置项不同

出0入0汤圆

 楼主| 发表于 2014-12-3 08:26:00 | 显示全部楼层
本帖最后由 myxiaonia 于 2014-12-3 08:27 编辑

这个是最后修改的rtx例程了,oksvn空间建立的项目目前已经废了

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x

出0入0汤圆

发表于 2015-2-5 23:48:39 | 显示全部楼层
楼主有没有做过RTX下程序开始为0x0800x000的试验(iap用)?
我修改安富莱的例程没有成功。

出0入0汤圆

 楼主| 发表于 2015-2-6 07:40:58 | 显示全部楼层
zaldy30 发表于 2015-2-5 23:48
楼主有没有做过RTX下程序开始为0x0800x000的试验(iap用)?
我修改安富莱的例程没有成功。 ...

iap程序用rtx么,没有问题吧,虽然没有这么做过。。。记得在跳转到app程序前关闭所有终端

出0入0汤圆

发表于 2015-2-15 11:51:22 | 显示全部楼层
myxiaonia 发表于 2015-2-6 07:40
iap程序用rtx么,没有问题吧,虽然没有这么做过。。。记得在跳转到app程序前关闭所有终端 ...


NVIC_SetVectorTable(NVIC_VectTab_FLASH, 0x2000);
这句放在os启动前,可以了。谢谢

出0入0汤圆

 楼主| 发表于 2015-2-15 11:57:20 | 显示全部楼层
zaldy30 发表于 2015-2-15 11:51
NVIC_SetVectorTable(NVIC_VectTab_FLASH, 0x2000);
这句放在os启动前,可以了。谢谢

你用了unpriviledge模式,确实是这样的,我想你也已经知道了原因了

出0入0汤圆

 楼主| 发表于 2015-3-6 14:15:03 | 显示全部楼层
rtx关于事件标志两个注意点:设置任务事件时需用任务tid,但是rtx不会对tid=0时情况作出检查,也就是当任务实际没有建立的时候,如果此时设置相应事件会导致不可预期的结果;
当任务等待事件时,事件可以保存2次状态,第一个使得任务进入就绪态,第二次如果此时任务没有阻塞在事件等待时,事件标志保存在事件变量中;这样的设计保证尽量减少事件的丢失,不过有利有弊,有些时候我们只需要保留1次宁可丢失过快的事件触发,务必清楚rtx事件的这个特征

出0入0汤圆

发表于 2015-3-29 11:50:25 | 显示全部楼层
我在学习这个操作系统时候出现了点问题 我在移植完操作系统后  使用了串口接收中断  但是进入不了中断函数

出0入0汤圆

 楼主| 发表于 2015-3-29 13:36:45 | 显示全部楼层
你贼漂亮 发表于 2015-3-29 11:50
我在学习这个操作系统时候出现了点问题 我在移植完操作系统后  使用了串口接收中断  但是进入不了中断函数 ...

有这事 不用这个rtos的时候能进中断不  把配置中断代码发上来吧,包括nvic中断使能和串口中断使能部分

出0入0汤圆

发表于 2015-4-14 20:15:01 | 显示全部楼层
myxiaonia 发表于 2015-3-29 13:36
有这事 不用这个rtos的时候能进中断不  把配置中断代码发上来吧,包括nvic中断使能和串口中断使能部分 ...

不使用这个操作系统的时候能进入中断,大神QQ多少,我在QQ上问你吧

出0入0汤圆

发表于 2015-4-15 11:23:03 | 显示全部楼层
最近在研究RTX学习了

出0入0汤圆

发表于 2015-4-15 11:25:50 | 显示全部楼层
t_phaseA = os_tsk_create (phaseA, 1);  中的1是什么意思,没看东

出0入0汤圆

 楼主| 发表于 2015-4-16 07:28:58 | 显示全部楼层
霸气侧漏 发表于 2015-4-15 11:25
t_phaseA = os_tsk_create (phaseA, 1);  中的1是什么意思,没看东

任务优先级呀

出0入0汤圆

发表于 2015-4-18 20:21:20 | 显示全部楼层
高人求助,我最近用RTX写了一个程序,整个程序整个流程走完之后,我指运行到最低优先级的任务的最后一句了,然后就进入os_idle_demon卡死了,我实在不知道为什么,之前也用RTX写过小程序好用,这次就不行了。您觉得是什么原因呢?

出0入0汤圆

 楼主| 发表于 2015-4-18 21:12:27 | 显示全部楼层
longoliver 发表于 2015-4-18 20:21
高人求助,我最近用RTX写了一个程序,整个程序整个流程走完之后,我指运行到最低优先级的任务的最后一句了 ...

你的所有任务,除掉idle任务,都永久挂起了么

出0入0汤圆

发表于 2015-4-18 21:19:41 | 显示全部楼层
myxiaonia 发表于 2015-4-18 21:12
你的所有任务,除掉idle任务,都永久挂起了么

所有任务都是__task void led2_task(void){
                  while(1)
                 {...
                 os_dly_wait(xx);
                 }
的形式,怎么会永久挂起呢,不科学啊

出0入0汤圆

发表于 2015-4-18 21:28:53 | 显示全部楼层
myxiaonia 发表于 2015-4-18 21:12
你的所有任务,除掉idle任务,都永久挂起了么

高人,方便的话,能帮我看一下代码吗?

  1. static U64 Task_start_stk[400/8];    /* 400-byte stack */
  2. static U64 led1_task_stk[400/8];    /* 400-byte stack */
  3. static U64 led2_task_stk[400/8];    /* 400-byte stack */
  4. static U64 touch_task_stk[1200/8];    /* 400-byte stack */
  5. static U64 adcshow_task_stk[1200/8];    /* 400-byte stack */

  6. __task void Task_start (void);            //rtx任务声明
  7. __task void led1_task (void);             //rtx任务声明
  8. __task void led2_task (void);            //rtx任务声明
  9. __task void touch_task (void);            //rtx任务声明
  10. __task void adcshow_task (void);            //rtx任务声明   

  11. OS_TID id1, id2, id3, id4;

  12. void task_create (void);                 //普通的任务的声明
  13. void ucos_load_main_ui(void) ;       //普通的任务的声明


  14. int main(void)
  15. {
  16.         delay_init();             
  17.         NVIC_Configuration();          
  18.         uart_init(9600);
  19.         LED_Init();
  20.         LCD_Init();
  21.         Adc_Init();                                  //ADC初始化
  22.         BEEP_Init();                        //蜂鸣器初始化       
  23.         KEY_Init();                                //按键初始化
  24.         TPAD_Init(72);                        //初始化TPAD
  25.         FSMC_SRAM_Init();                //初始化外部SRAM
  26.         mem_init(SRAMIN);                //初始化内部内存池
  27.         mem_init(SRAMEX);                //初始化外部内存池
  28.         tp_dev.init();
  29.         ucos_load_main_ui();
  30.   
  31.         os_sys_init_user(Task_start, 10, &Task_start_stk, sizeof(Task_start_stk));    //初始化RTX
  32.         while(1) ;
  33. }


  34. __task void Task_start(void)       //优先级10
  35.         {  
  36.         task_create();
  37.         os_tsk_delete_self ();
  38.         }

  39. //开始任务
  40. void task_create(void)
  41. {
  42.   id1=os_tsk_create_user (led1_task, 2, &led1_task_stk, sizeof(led1_task_stk));
  43.   id2=os_tsk_create_user (led2_task, 3, &led2_task_stk, sizeof(led2_task_stk));
  44.   id3=os_tsk_create_user (adcshow_task,7, &adcshow_task_stk,sizeof(adcshow_task_stk));
  45.   id4=os_tsk_create_user (touch_task,8, &touch_task_stk,sizeof(touch_task_stk));
  46. }

  47. void ucos_load_main_ui(void)
  48. {
  49.         LCD_Clear(WHITE);        //清屏
  50.         POINT_COLOR=RED;        //设置字体为红色
  51.         LCD_ShowString(10,10,200,16,16,"Pan Meilong");       
  52.         LCD_ShowString(10,30,200,16,16,"UCOSII TEST3");       
  53.         LCD_ShowString(10,50,200,16,16,"2011059040010");
  54.            LCD_ShowString(10,75,240,16,16,"TPAD:TMR2 SW   KEY_UP:ADJUST");       
  55.            LCD_ShowString(10,95,240,16,16,"KEY0:DS0 KEY1:Q SW KEY2:CLR");       
  56.         LCD_DrawLine(0,70,lcddev.width,70);
  57.         LCD_DrawLine(120,0,120,70);
  58.         LCD_DrawLine(0,120,lcddev.width,120);
  59.         LCD_DrawLine(0,220,lcddev.width,220);
  60.         LCD_DrawLine(120,120,120,lcddev.height);
  61.         LCD_ShowString(5+120,125,240,16,16,"FLAGS");//信号量集
  62.         LCD_ShowString(5,225,240,16,16,"TOUCH");        //触摸屏
  63.         LCD_ShowString(5+120,225,240,16,16,"TMR2");        //队列消息
  64.         POINT_COLOR=BLUE;//设置字体为蓝色
  65.         LCD_ShowString(5,125,240,16,16,"ADC_CH0_VAL:");             
  66.         LCD_ShowString(5,175,240,16,16,"ADC_CH0_VOL:");
  67.         LCD_ShowString(5,200,240,16,16,"0.000V");       
  68.         LCD_ShowString(150,10,200,16,16,"CPU:   %");
  69.         delay_ms(300);
  70. }




  71. //触摸屏任务                  //优先级8
  72. __task void touch_task(void)
  73. {                 
  74.         while(1)
  75.         {
  76.                 tp_dev.scan(0);                  
  77.                 if(tp_dev.sta&TP_PRES_DOWN)                //触摸屏被按下
  78.                 {       
  79.                          if(tp_dev.x<120&&tp_dev.y<lcddev.height&&tp_dev.y>220)        //判断是否在Touch Area之内
  80.                         {       
  81.                                 u16 color_draw=RED;
  82.                                 TP_Draw_Big_Point(tp_dev.x,tp_dev.y,color_draw);        //画图         
  83.                                 os_dly_wait(2);                                                               //我要是减少这个数值会不会连贯
  84.                         }
  85.                 }else os_dly_wait(2);        //没有按键按下的时候
  86.         }
  87. }


  88. __task void adcshow_task(void)          //优先级7
  89. {
  90.   u16 adcx;
  91.         float temp;
  92.   POINT_COLOR=BLUE;

  93.         LCD_ShowString(5,125,240,16,16,"ADC_CH0_VAL:");             
  94.         LCD_ShowString(5,175,240,16,16,"ADC_CH0_VOL:");
  95.         LCD_ShowString(5,200,240,16,16,"0.   V");
  96.         while(1)
  97.         {
  98.                 adcx=Get_Adc_Average(ADC_Channel_3,10);
  99.                 LCD_ShowxNum(5,150,adcx,4,16,0);//显示ADC的值
  100.                 temp=(float)adcx*(3.3/4096);
  101.                 adcx=temp;
  102.                 LCD_ShowxNum(5,200,adcx,1,16,0);//显示电压值
  103.                 temp-=adcx;
  104.                 temp*=1000;
  105.                 LCD_ShowxNum(21,200,temp,3,16,0X80);
  106.                 LED0=!LED0;
  107.                 os_dly_wait(25);       
  108.         }

  109. }


  110. __task void led2_task(void)     //优先级2
  111. {          
  112.         while(1)
  113.         {
  114.                 LED1=0;
  115.                 delay_ms(300);
  116.                 LED1=1;
  117.                 os_dly_wait(30);
  118.         }
  119. }

  120. __task void led1_task (void)   //优先级1
  121. {                
  122.         while(1)
  123.         {
  124.                 LED0=1;
  125.                 delay_ms(300);
  126.                 LED0=0;
  127.                 os_dly_wait(30);            //最后死在这里J-LINK结果是进入os_idle_demon出不来了
  128.         }
  129. }
复制代码

出0入0汤圆

 楼主| 发表于 2015-4-18 22:15:06 | 显示全部楼层
longoliver 发表于 2015-4-18 21:28
高人,方便的话,能帮我看一下代码吗?

代码看上去也没有什么问题。。。
你可以打开rtx的os调试模式看看,这样你可以看到各任务状态和任务调度情况

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x

出0入0汤圆

发表于 2015-4-18 22:23:24 | 显示全部楼层
myxiaonia 发表于 2015-4-18 22:15
代码看上去也没有什么问题。。。
你可以打开rtx的os调试模式看看,这样你可以看到各任务状态和任务调度情 ...

好实用的方法,太谢谢了!

出0入0汤圆

发表于 2015-5-13 22:43:25 | 显示全部楼层
谢谢分享,下下来编译看看

出0入0汤圆

发表于 2015-8-26 14:37:06 | 显示全部楼层
最近在弄RTX,发现用stm32运行RTX在privileged mode模式下,串口中断接受数据后,会收不到数据,然后过一段时间又能收到纠结

出0入0汤圆

 楼主| 发表于 2015-8-26 15:08:34 | 显示全部楼层
霸气侧漏 发表于 2015-8-26 14:37
最近在弄RTX,发现用stm32运行RTX在privileged mode模式下,串口中断接受数据后,会收不到数据,然后过一段 ...

运行在特权模式下 和 串口接受错乱 应该没有关系的

出0入0汤圆

发表于 2015-8-26 15:10:07 | 显示全部楼层
myxiaonia 发表于 2015-8-26 15:08
运行在特权模式下 和 串口接受错乱 应该没有关系的

有个比较奇怪的是,串口收发一开始是ok的。运行一会后就收不到

出0入0汤圆

 楼主| 发表于 2015-8-26 15:34:25 | 显示全部楼层
霸气侧漏 发表于 2015-8-26 15:10
有个比较奇怪的是,串口收发一开始是ok的。运行一会后就收不到

你如果是用的cmsis-rtx的话我可不熟悉的哦,要不代码贴上来吧

出0入0汤圆

发表于 2015-8-26 17:15:18 | 显示全部楼层
本帖最后由 霸气侧漏 于 2015-8-26 17:16 编辑
myxiaonia 发表于 2015-8-26 15:34
你如果是用的cmsis-rtx的话我可不熟悉的哦,要不代码贴上来吧


貌似是找到问题了,中断里收数据放在缓存里,收到特定字符后响应 isr_evt_set (U16 event_flags, OS_TID task_id);   再去处理这个时间对应的函数。


然而问题来了,我主机发送了5次命令他没有执行,我就一直发,等我发第6次指令的时候。6条指令都执行,不知道这是为何。难道相同的命令会被保存么?有没有法办这样,比如我正在执行一个函数,相同的请求来了,我就丢弃这个指令。或者提高串口事件的响应速度。

出0入0汤圆

 楼主| 发表于 2015-8-26 21:44:18 | 显示全部楼层
霸气侧漏 发表于 2015-8-26 17:15
貌似是找到问题了,中断里收数据放在缓存里,收到特定字符后响应 isr_evt_set (U16 event_flags, OS_TID  ...

如果中断过于频繁,事件标志可以多保留一次该事件,再多的话就会丢失

出0入0汤圆

发表于 2015-8-26 22:38:37 | 显示全部楼层
本帖最后由 霸气侧漏 于 2015-8-26 22:43 编辑
myxiaonia 发表于 2015-8-26 21:44
如果中断过于频繁,事件标志可以多保留一次该事件,再多的话就会丢失


就是因为中断没有及时处理,造成事故,导致多个中断一起来了,怎样让中断及时处理数据

出0入0汤圆

发表于 2015-8-27 17:48:16 | 显示全部楼层
myxiaonia 发表于 2015-8-26 21:44
如果中断过于频繁,事件标志可以多保留一次该事件,再多的话就会丢失

MDK怎么配置Interrupt Mode Stack  我看到,这个RTX上面介绍说,用自己创建的中断要配置堆栈

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x

出0入0汤圆

 楼主| 发表于 2015-8-27 19:45:16 | 显示全部楼层
霸气侧漏 发表于 2015-8-27 17:48
MDK怎么配置Interrupt Mode Stack  我看到,这个RTX上面介绍说,用自己创建的中断要配置堆栈
...

arm7有好几种模式,因此有不同的栈,我也不是很清楚,我是直接从cortex-m3学习arm

出0入0汤圆

发表于 2015-8-27 19:52:34 | 显示全部楼层
myxiaonia 发表于 2015-8-27 19:45
arm7有好几种模式,因此有不同的栈,我也不是很清楚,我是直接从cortex-m3学习arm ...

哥们我的是stm32 可以配置的啊。

出0入0汤圆

 楼主| 发表于 2015-8-27 21:45:15 | 显示全部楼层
霸气侧漏 发表于 2015-8-27 19:52
哥们我的是stm32 可以配置的啊。

唉  我敢保证你贴的内容至少不是cortex-m系列相关的。。。cortex系列称为svc而不再是swi,你看上面提到中断模式,监视者模式等等,都是arm处理器才有的

出0入0汤圆

发表于 2015-8-28 07:00:17 来自手机 | 显示全部楼层
哥们,应该是我的串口接受中断里面收到特定字符,就给他一个事件。当事件来的时候,中断还没有处理完,是否马上处理事件,还是等串口中断处理完在去响应事件。

出0入0汤圆

 楼主| 发表于 2015-8-31 11:30:54 | 显示全部楼层
增加mdk515中动态内存管理函数和cm0操作系统相关层

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x

出0入0汤圆

发表于 2015-8-31 12:30:21 | 显示全部楼层
myxiaonia 发表于 2015-8-31 11:30
增加mdk515中动态内存管理函数和cm0操作系统相关层

你是如何实现的又发表于半个小时之前的?

出0入0汤圆

发表于 2015-8-31 12:31:21 | 显示全部楼层
哦,我自己看错了。最近需要学习这个,所以也关注。

出0入0汤圆

发表于 2015-9-17 17:33:41 | 显示全部楼层
/*----------------------------------------------------------------------------
*        Switch LED on
*---------------------------------------------------------------------------*/
void Switch_On  (unsigned char led) {

  LED_On (led);
  os_mut_wait(mut_GLCD, 0xffff);
  GLCD_SetBackColor(White);                         /* Set the Back Color */
  GLCD_SetTextColor(Green);                         /* Set the Text Color */
  GLCD_DisplayChar(4, 12+led, __FI, 0x80+1);         /* Circle Full        */
  os_mut_release(mut_GLCD);
}

/*----------------------------------------------------------------------------
*        Switch LED off
*---------------------------------------------------------------------------*/
void Switch_Off (unsigned char led) {

  LED_Off (led);
  os_mut_wait(mut_GLCD, 0xffff);
  GLCD_SetBackColor(White);                         /* Set the Back Color */
  GLCD_SetTextColor(Green);                         /* Set the Text Color */
  GLCD_DisplayChar(4, 12+led, __FI, 0x80+0);         /* Circle Empty       */
  os_mut_release(mut_GLCD);
}


/*----------------------------------------------------------------------------
*        Function 'signal_func' called from multiple tasks
*---------------------------------------------------------------------------*/
void signal_func (OS_TID task)  {
  os_evt_set (0x0100, t_clock);          /* send event signal to clock task  */
  os_dly_wait (50);                      /* delay 50 clock ticks             */
  os_evt_set (0x0100, t_clock);          /* send event signal to clock task  */
  os_dly_wait (50);                      /* delay 50 clock ticks             */
  os_evt_set (0x0001, task);             /* send event to task 'task'        */
                                                                                                /* delay 50 clock ticks             */
}

/*----------------------------------------------------------------------------
*        Task 1 'phaseA': Phase A output
*---------------------------------------------------------------------------*/
__task void phaseA (void) {
  for (;;) {
    os_evt_wait_and (0x0001, 0xffff);    /* wait for an event flag 0x0001    */
    Switch_On (LED_A);
    signal_func (t_phaseB);              /* call common signal function      */
    Switch_Off(LED_A);
  }
}

/*----------------------------------------------------------------------------
*        Task 2 'phaseB': Phase B output
*---------------------------------------------------------------------------*/
__task void phaseB (void) {
  for (;;) {
    os_evt_wait_and (0x0001, 0xffff);    /* wait for an event flag 0x0001    */
    Switch_On (LED_B);
    signal_func (t_phaseC);              /* call common signal function      */
    Switch_Off(LED_B);
  }
}

/*----------------------------------------------------------------------------
*        Task 3 'phaseC': Phase C output
*---------------------------------------------------------------------------*/
__task void phaseC (void) {
  for (;;) {
    os_evt_wait_and (0x0001, 0xffff);    /* wait for an event flag 0x0001    */
    Switch_On (LED_C);
    signal_func (t_phaseD);              /* call common signal function      */
    Switch_Off(LED_C);
  }
}

/*----------------------------------------------------------------------------
*        Task 4 'phaseD': Phase D output
*---------------------------------------------------------------------------*/
__task void phaseD (void) {
  for (;;) {
    os_evt_wait_and (0x0001, 0xffff);    /* wait for an event flag 0x0001    */
    Switch_On (LED_D);
    signal_func (t_phaseA);              /* call common signal function      */
    Switch_Off(LED_D);
  }
}

/*----------------------------------------------------------------------------
*        Task 5 'clock': Signal Clock
*---------------------------------------------------------------------------*/
__task void clock (void) {
  for (;;) {
    os_evt_wait_and (0x0100, 0xffff);    /* wait for an event flag 0x0100    */
    Switch_On (LED_CLK);
    os_dly_wait (8);                     /* delay 8 clock ticks              */
    Switch_Off(LED_CLK);
  }
}

/*----------------------------------------------------------------------------
*        Task 6 'lcd': LCD Control task
*---------------------------------------------------------------------------*/
__task void lcd (void) {

  for (;;) {
    os_mut_wait(mut_GLCD, 0xffff);
    GLCD_SetBackColor(Blue);                           /* Set the Text Color */
    GLCD_SetTextColor(White);                          /* Set the Text Color */
    GLCD_DisplayString(0, 0, __FI, "         MCB4300 Demo          ");
    GLCD_DisplayString(1, 0, __FI, "          RTX Blinky           ");
    GLCD_DisplayString(2, 0, __FI, "         www.keil.com          ");
    os_mut_release(mut_GLCD);
    os_dly_wait (400);

    os_mut_wait(mut_GLCD, 0xffff);
    GLCD_SetBackColor(Blue);                           /* Set the Text Color */
    GLCD_SetTextColor(Red);                            /* Set the Text Color */
    GLCD_DisplayString(0, 0, __FI, "         MCB4300 Demo          ");
    GLCD_DisplayString(1, 0, __FI, "          RTX Blinky           ");
    GLCD_DisplayString(2, 0, __FI, "         www.keil.com          ");
    os_mut_release(mut_GLCD);
    os_dly_wait (400);
  }
}

/*----------------------------------------------------------------------------
*        Task 7 'init': Initialize
*---------------------------------------------------------------------------*/
__task void init (void) {

  os_mut_init(mut_GLCD);

  t_phaseA = os_tsk_create (phaseA, 0);  /* start task phaseA                */
  t_phaseB = os_tsk_create (phaseB, 0);  /* start task phaseB                */
  t_phaseC = os_tsk_create (phaseC, 0);  /* start task phaseC                */
  t_phaseD = os_tsk_create (phaseD, 0);  /* start task phaseD                */
  t_clock  = os_tsk_create (clock, 0);   /* start task clock                 */
  t_lcd    = os_tsk_create (lcd, 0);     /* start task lcd                   */
  os_evt_set (0x0001, t_phaseA);         /* send signal event to task phaseA */
  os_tsk_delete_self ();
}

/*----------------------------------------------------------------------------
*        Main: Initialize and start RTX Kernel
*---------------------------------------------------------------------------*/
int main (void) {

  LED_Init();                               /* Initialize the LEDs           */
   
  GLCD_Init();                              /* Initialize the GLCD           */
  GLCD_Clear(White);                        /* Clear the GLCD                */

  os_sys_init(init);                        /* Initialize RTX and start init */
}
非常谢谢楼主的分享,但是我现在在事件函数上有点混乱,现在这个os_evt_set (0x0001, t_phaseA); 这个函数运行了,是不是直接调到 t_phaseA这个函数里面去?还有就是这个 os_evt_wait_and (0x0001, 0xffff);    这个函数里面0x0001,又代表什么意思,脑袋完全是混乱的。真心希望楼主能帮我们这些菜鸟指点。

出0入0汤圆

发表于 2015-9-17 17:34:47 | 显示全部楼层
顺便把今天下午整理的rtx常用的函数上传了

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x

出0入0汤圆

发表于 2015-9-17 18:00:12 | 显示全部楼层
我也在用CMSIS RTX了,在STM32F030上跑,

请问一下,任务锁和中断锁去哪里了?取消了?

谢谢!

出0入76汤圆

发表于 2015-9-17 22:03:09 | 显示全部楼层
不错, 先感谢分享, 先标记一下, 等后面有空了,再来仔细学习

出0入0汤圆

 楼主| 发表于 2015-9-17 22:25:04 | 显示全部楼层
TheBest 发表于 2015-9-17 17:33
/*----------------------------------------------------------------------------
*        Switch LED  ...

由于前面几个任务创建的优先级都是1(0是保留给idle任务的,因此自动提升到1),init这个初始化任务默认优先级也是1,几个任务传教后都在就绪态。

os_evt_set (0x0001, t_phaseA)执行后不会立即切换任务,原因是几个任务优先级都一样还没机会被调度,t_phaseA也没有等待事件,这个事件设定函数只会置位对应事件。

当init任务销毁后,按照自然顺序先运行t_phaseA,由于提前置位了事件,t_phaseA将一直运行下去直到被再次阻塞,你看到它的signal_func (t_phaseB); 将唤醒t_clock任务,最后又唤醒了t_phaseB

这样一个个运行过去。。。

你想看到详细的调度过程话,可以下载楼主位例程,用软件仿真就可以看到,os相关的调试支持请看keil的帮助文档相关章节

os_evt_wait_and (0x0001, 0xffff);  每个任务有16个事件标志,0x0001就代表第0位这个事件标志,0xffff代表无限等待这个事件,其他值都是代表超时时间,单位是一个tick
wait_and代表等待的事件必须同时到达,这里只有一个事件的话就是只等待这个事件到底
所以这句话意思:无限等待0x0001这个事件到来


想要学习的话,还是要看帮助文档的,像这话的回答再详细也是挂一漏万,希望对你有帮助

出0入0汤圆

发表于 2015-9-17 23:36:06 | 显示全部楼层
本帖最后由 TheBest 于 2015-9-17 23:49 编辑
myxiaonia 发表于 2015-9-17 22:25
由于前面几个任务创建的优先级都是1(0是保留给idle任务的,因此自动提升到1),init这个初始化任务默认 ...


谢谢您的解答,虽然不是很懂,但是感觉思路是有了,明天再去详细看看keil里的资料。非常感谢


但是我还有二个疑问,第一:os_evt_set()这个函数是完后,os_evt_wait_and ()/os_evt_wait_or()这两个是怎么运行的,我只要是对这个不是很清楚。
第二就是关于os_evt_set()这个函数的16个事件标志,0x0001就代表第0位这个事件标志,那0x0002是表示第1位吗?还是0x0010表示第一位?。
刚学习这个,所以问题有点BC,但是确实卡了我一天。


出0入0汤圆

 楼主| 发表于 2015-9-18 08:00:43 | 显示全部楼层
本帖最后由 myxiaonia 于 2015-9-18 08:07 编辑

os_evt_wait_and ()/os_evt_wait_or()  事件等待函数就是让任务等待事件,没有等到的话,看超时设置,0代表不等待立刻返回结果,0xffff的话无限期等待,其他值的话会等待相应数量的tick

内部机理如下:当因为等待任务被挂起后,如果无限期等待的话此任务不会进入延时链表,延时链表是rtx内部挂起任务超时处理的机制,当限定时间内任务事件被设置,任务被设置成就绪态,同时从延时链表中删除本任务;假如是超时时间到了,也会做上述相同的操作,唯一的区别就是返回值是超时,前者是成功

os_evt_wait_or如果是多个事件,成功后还可以查看具体是哪些事件到底了,有个查询事件的函数可以查看

关于os_evt_set()这个函数的16个事件标志,0x0001就代表第0位这个事件标志,那0x0002是表示第1位吗?还是0x0010表示第一位?。
0x0002是第1位事件,0x0010的话就不可能有16个事件了

出0入0汤圆

发表于 2015-9-18 09:17:28 | 显示全部楼层
yiminglei_2 发表于 2015-9-17 18:00
我也在用CMSIS RTX了,在STM32F030上跑,

请问一下,任务锁和中断锁去哪里了?取消了?

另外
RTX的
void os_itv_set (U16 interval_time);
void os_itv_wait (void);
用什么方法替换呢?

谢谢!

出0入0汤圆

 楼主| 发表于 2015-9-18 09:27:23 | 显示全部楼层
yiminglei_2 发表于 2015-9-18 09:17
另外
RTX的
void os_itv_set (U16 interval_time);

这两个rtx所谓区间延时功能,可以让任务周期性执行

相比较使用传统的延时固定tick数的方法,可以极大克服执行时间超过1个tick以上的任务无法准确的周期执行的困扰
内部实现机理是让任务在时间戳这个点上运行,任务间延时可能不固定,但是任务执行的时间点却是最大可能固定的

这个是特殊功能,如果不想用,只能用传统的延时方法

以前我在例程的版本库里有关详细讨论,不过网上那个库废掉后,不知道相关记录丢失没有
最权威的还是看帮助文档

出0入0汤圆

发表于 2015-9-18 09:31:25 | 显示全部楼层
本帖最后由 yiminglei_2 于 2015-9-18 09:47 编辑
myxiaonia 发表于 2015-9-18 09:27
这两个rtx所谓区间延时功能,可以让任务周期性执行

相比较使用传统的延时固定tick数的方法,可以极大克 ...


谢谢楼主回复!

那在CMSIS-RTOS RTX如何保护临界区呢?

tsk_lock (void);和tsk_unlock (void);都没找到。

谢谢!

出0入0汤圆

发表于 2015-9-21 10:03:55 | 显示全部楼层
myxiaonia 发表于 2015-9-18 08:00
os_evt_wait_and ()/os_evt_wait_or()  事件等待函数就是让任务等待事件,没有等到的话,看超时设置,0代 ...

谢谢楼主耐心的解答,你看看我的理解对不,0x0001表示第零位,0x0010表示第一位,0x0011表示第二位,跟四位二进制一样的,也刚好16个事件。

出0入0汤圆

发表于 2015-9-21 10:14:45 | 显示全部楼层
还有对于os_evt_set()这个函数我是这个理解的,你看看对不对。比如说我在task1任务里运行这个函数os_evt_wait_and (0x0001, 0xffff);则表示task1挂起,不进入运行,直到这个函数os_evt_set(0x0001,task1)在别的任务中运行,那么task1函数将再次进入就绪状态等待运行。
但是我这么理解的话os_evt_wait_and和os_evt_wait_or这个两个函数在功能上有什么不同那,我理解的是如果task1和task2和task3里面都有os_evt_wait_and(0x0001, 0xffff);那么必须得要os_evt_set(0x0001,task1);os_evt_set(0x0001,task2);os_evt_set(0x0001,task3)同时运行,那三个任务才能够同时进入就绪态准备运行,否者少一个都不运行。
对于os_evt_wait_or()这个就是不用同时产生os_evt_set(0x0001,task1);os_evt_set(0x0001,task2);os_evt_set(0x0001,task3)这个三个,只要任意一个发生,三个函数都进入就绪态。
楼主你看看我这个理解是不是对的。

出0入0汤圆

 楼主| 发表于 2015-9-21 10:29:18 | 显示全部楼层
yiminglei_2 发表于 2015-9-18 09:31
谢谢楼主回复!

那在CMSIS-RTOS RTX如何保护临界区呢?

不清楚  我不太懂cmsis-rtx  还没时间研究

出0入0汤圆

 楼主| 发表于 2015-9-21 10:37:50 | 显示全部楼层
TheBest 发表于 2015-9-21 10:03
谢谢楼主耐心的解答,你看看我的理解对不,0x0001表示第零位,0x0010表示第一位,0x0011表示第二位,跟四 ...


你的理解都是错的  如果有时间  你还真得看看帮助文档  然后看看我写的笔记   这样猜测的话最后花的时间一定会比看帮助花的时间长

事件是个16位数,每个位代表一个独立的事件标志

os_evt_wait_and和os_evt_wait_or  你的表述我没看懂,因为你设置的都是不同任务的同一个事件,而实际需要的是同一个任务的不同事件
os_evt_wait_and代表本任务需要多个任务同时到达后才能就绪,比如等待的是0x3,必须0x1和0x2这两个事件到达才行,而os_evt_wait_or 只需要任一个(两个同时到也没关系)到达就就绪

出0入0汤圆

发表于 2015-9-21 14:09:18 | 显示全部楼层
myxiaonia 发表于 2015-9-21 10:37
你的理解都是错的  如果有时间  你还真得看看帮助文档  然后看看我写的笔记   这样猜测的话最后花的时间 ...

恩,我再一个一个函数的去看看

出0入0汤圆

发表于 2015-9-22 18:29:23 | 显示全部楼层
我现在用cmsis

出0入0汤圆

 楼主| 发表于 2015-9-22 21:20:38 | 显示全部楼层

与时俱进啊嘿嘿

出0入0汤圆

发表于 2015-9-24 13:12:15 | 显示全部楼层
哥们, RTX适合做电机控制不,有多路PWM波,嘿嘿,没有相关的资料

出0入0汤圆

发表于 2015-9-24 14:16:06 | 显示全部楼层

大神,请问一下怎么停止调度器运行呢?谢谢!

出0入0汤圆

 楼主| 发表于 2015-9-24 16:24:16 | 显示全部楼层
霸气侧漏 发表于 2015-9-24 13:12
哥们, RTX适合做电机控制不,有多路PWM波,嘿嘿,没有相关的资料

不知道啊 嘿嘿

出0入0汤圆

发表于 2015-9-24 17:20:46 | 显示全部楼层

大神你用rtx做过pwm方面的应用没,我看有些介绍说,中断多了对rtx有影响

出0入0汤圆

 楼主| 发表于 2015-9-24 23:04:48 | 显示全部楼层
霸气侧漏 发表于 2015-9-24 17:20
大神你用rtx做过pwm方面的应用没,我看有些介绍说,中断多了对rtx有影响

没有做过  可以没有影响 中断不要调用rtx函数  各干个事

出0入0汤圆

发表于 2015-9-25 09:14:17 | 显示全部楼层
myxiaonia 发表于 2015-9-24 23:04
没有做过  可以没有影响 中断不要调用rtx函数  各干个事

OK 回头我试试看。嘿嘿

出0入0汤圆

发表于 2017-2-13 11:34:36 | 显示全部楼层
楼主,从amo到armfly,一直在关注你的帖子。最近是否有更新,能否放一些高级应用示例?谢谢!

出0入0汤圆

 楼主| 发表于 2017-2-13 13:01:42 | 显示全部楼层
heimareed 发表于 2017-2-13 11:34
楼主,从amo到armfly,一直在关注你的帖子。最近是否有更新,能否放一些高级应用示例?谢谢! ...

主要是内核分析啊,没有应用的例子,当然自己产品上是有用到的,但是也不好放上来

我个人就是用我修改过的rtx在用,只要用法到位,没有说不稳定的,没有问题

出0入25汤圆

发表于 2017-5-25 15:53:27 | 显示全部楼层

好笔记,,标记慢慢学习

出0入0汤圆

发表于 2017-6-15 19:12:57 | 显示全部楼层
最近在重新看楼主最终版本的程序,并且与官方原文件进行对比。目前看了MemBox、List、Event这些问题,发现这几个文件比较多的是对原文件中的重复操作进行裁剪,提高运行速度,但是不懂的是为什么楼主把状态值赋值放到前面,如果按照原文件的思路,似乎存在一定的错误。比如rt_evt_wait函数中,block_state = WAIT_AND;是故意放到判断语句之前的吗?还请楼主解惑,谢谢!

出0入0汤圆

 楼主| 发表于 2017-6-15 23:55:29 | 显示全部楼层
heimareed 发表于 2017-6-15 19:12
最近在重新看楼主最终版本的程序,并且与官方原文件进行对比。目前看了MemBox、List、Event这些问题,发现 ...

代码修改后,某些情况下会直接返回,你看代码段里有return,这里提前把block状态设置好,即使之后没有用到也没有关系

这句赋值语句产生的代码量忽略不计,确实是为了减少最后的code大小而修改的

出0入0汤圆

发表于 2017-6-16 10:54:55 | 显示全部楼层
myxiaonia 发表于 2017-6-15 23:55
代码修改后,某些情况下会直接返回,你看代码段里有return,这里提前把block状态设置好,即使之后没有用 ...

谢谢楼主回复!!!昨天把整个代码全部做了下比对。参照楼主的一些优化方式,对原代码进行了优化。
但是大部分还是保持原样,主要是没能力深入研究。后面会尝试做一些Demo程序进行测试。到时候再想楼主讨教……

出0入0汤圆

发表于 2017-8-16 12:50:05 | 显示全部楼层
支持楼主

出0入0汤圆

发表于 2018-6-27 09:35:39 | 显示全部楼层
最近正在学习RTX

出0入0汤圆

发表于 2018-12-5 17:09:33 | 显示全部楼层
请问 楼主,下面这个地方不懂,能不能给解释一下:
下图中的24 是啥意思?这段代码 汇编指令 都知道,但是涉及堆栈 和 编译方面 不是很懂,能不能给讲讲

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x

出0入0汤圆

发表于 2018-12-5 17:17:35 | 显示全部楼层
我正在 学习 rtx ,现在 想要 了解一下 栈的 分布 ,特权模式 和 非特权模式的区别,中断优先级 设置,线程模式,处理模式区别,函数调用 函数返回 对寄存器R0,R1 之类的寄存器的调用
需要看什么书,或者资料啊

出0入0汤圆

 楼主| 发表于 2018-12-5 20:30:21 | 显示全部楼层
maimaige 发表于 2018-12-5 17:09
请问 楼主,下面这个地方不懂,能不能给解释一下:
下图中的24 是啥意思?这段代码 汇编指令 都知道,但是涉 ...

这个你得看cm3权威指南,和mcu设计息息相关

出0入0汤圆

发表于 2021-10-6 16:26:10 | 显示全部楼层
感觉RTX 的邮箱有bug,有时候出 os_error,错误代码就是 OS_ERR_MBX_OVF ,问题我发送邮箱前都有mbx_check 不为0才 isr_mbx_send

出0入0汤圆

发表于 2022-1-14 11:35:40 | 显示全部楼层
大家找os_mut_wait发生OS_R_TMO的原因有什么思路吗?
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|Archiver|amobbs.com 阿莫电子技术论坛 ( 粤ICP备2022115958号, 版权所有:东莞阿莫电子贸易商行 创办于2004年 (公安交互式论坛备案:44190002001997 ) )

GMT+8, 2024-4-24 19:48

© Since 2004 www.amobbs.com, 原www.ourdev.cn, 原www.ouravr.com

快速回复 返回顶部 返回列表