你的浏览器版本过低,可能导致网站不能正常访问!
为了你能正常使用网站功能,请使用这些浏览器。

哪位有CMSIS_OS 就是封装后的freeRTos的说明

[复制链接]
Tony_Duan 提问时间:2015-9-7 17:45 /
阅读主题, 点击返回1楼
收藏 1 评论22 发布时间:2015-9-7 17:45
22个回答
qiu-368230 回答时间:2015-9-11 12:21:02
Tony_Duan 发表于 2015-9-11 07:30
我也是刚玩,cmsis_os 显然是封装了freertos,如果完全使用freertos命令在程序中也是没问题的,但是cmsis ...

谷歌上不去好多资料都查不到,国内的搜索就是一大堆广告
Tony_Duan 回答时间:2015-10-1 13:45:51
更新一下,说说有关os的osSignalWait(0,osWaitForever);,这个等待是等待任何信号的进来就解除阻塞。看了文档不是很明白,怎么都搜索不到例子,所以根据自己的理解,在任务中判断信号量来处理不同的功能。根据默认一个任务可以有8个信号量,我只用到两个,信号0x01 和0x02.
osEvent eve;
eve=osSignalWait(0,osWaitForever);

if(eve.value.signals==0x01){}
if(eve.value.signals==0x02){}
运行结果是如果信号1先触发的话,那么信号2就完蛋了,如果信号2先触发信号1就完蛋,百思不得其解,
看定义如下typedef struct  {
  osStatus                 status;     ///< status code: event or error information
  union  {
    uint32_t                    v;     ///< message as 32-bit value
    void                       *p;     ///< message or mail as void pointer
    int32_t               signals;     ///< signal flags
  } value;                             ///< event value
  union  {
    osMailQId             mail_id;     ///< mail id obtained by \ref osMailCreate
    osMessageQId       message_id;     ///< message id obtained by \ref osMessageCreate
  } def;                               ///< event definition
} osEvent;

忽然有点明白了,改变判断语句如下:
if(eve.value.signals & 0x01)
if(eve.value.signals & 0x02)
程序正常,位判断
Tony_Duan 回答时间:2015-10-3 12:25:51
继续这个帖子也算是我的学习笔记吧,这个也是我目前正在做的一个项目,先项目后学习哈哈。
今天遇到一个奇怪的问题,程序重写了多次,没办法用串口跟踪查看,发现判断条件已经具备,但是没有执行条件语句下的内容,而且发现触发条件值很快改变,根本没有经过我的延迟时间。如果是自动循环,则条件语句第一次不执行,第二次开始完全执行了条件语句中的内容。
代码如下:
eve=osMessageGet(SampleControlQueueHandle,500);
                if(eve.status==osEventMessage)
                {
                        rSampleControldef=eve.value.p;
                        lSampleStartFlag=rSampleControldef->startSampleFlag;
                        lAutoOrManual=rSampleControldef->autoOrManual;
                        lForwardTime=rSampleControldef->forwardTime*100;
                        lBackFlowTimeTime=rSampleControldef->autoLoopTime*100-lForwardTime;
                       
                        rSampleFlag=1;
                        osPoolFree(samplePoolHandle,rSampleControldef);
                }
                if(rSampleFlag)
                {
                        HAL_UART_Transmit(&huart1,"SampleOK\r\n",10,100);
                }
                else
                {
                        HAL_UART_Transmit(&huart1,"SampleNOOK\r\n",12,100);
                }
                if(lSampleStartFlag)
                {
                        HAL_UART_Transmit(&huart1,"StartOK\r\n",9,100);
                }
                else
                {
                        HAL_UART_Transmit(&huart1,"StartNOOK\r\n",11,100);
                }
                if(lSampleStartFlag && rSampleFlag)
                {
                        CHROM_SAMPLE_ON;
                        LED7_ON;
                        HAL_UART_Transmit(&huart1,"Forwarding\r\n",12,100);
                        osDelayUntil(&lastWakeTime,lForwardTime);
                       
                        CHROM_SAMPLE_OFF;
                        LED7_OFF;
                        HAL_UART_Transmit(&huart1,"BackFlowing\r\n",13,100);
                        osDelayUntil(&lastWakeTime,lBackFlowTimeTime);
                        HAL_UART_Transmit(&huart1,"Chrom Standby\r\n",15,100);
                        if(!lAutoOrManual)rSampleFlag=0;
                }
                osDelay(500);
初步怀疑是os智能地执行了调度,由于任务开始时是无意义的空循环,所以os没有调用那部分空闲代码,
Tony_Duan 回答时间:2015-10-3 13:11:18
看了不少热心网友的帖子,说是keil优化,还有变量要声明成volatile,可惜没有太多耐心去学习目前用不到的知识。实际问题很简单,我换成osDelay就没问题, 问题出在osDelayUntil上,变量lastWakeTime会自动更新,但是不运行osdelayuntil是不会自动更新的。我的循环刚开始是没用到osdelayuntil的,所以可以在末尾的delay换成osdelayuntil,或者重新读取一下,问题解决,封装的cmsis_os虽然简单但是详细资料太少,郁闷哈
Tony_Duan 回答时间:2015-10-6 23:45:10
osEvent eve;
eve=osSignalWait(0,osWaitForever);
本来是可以根据信号不同在一个任务中执行不同的功能,前提是要把信号清零。我一直奇怪信号设置一后就不变了,比如我设置了osSignalSet(xxsHandle,0x01);osSignalSet(xxsHandle,0x02);osSignalSet(xxsHandle,0x04);之后,下次再设置信号0x01的话,其实另外两个模块下的程序也会执行,也就是多oswaitsignal没有清零任何信号,查看变量证实了我的判断,于是想用ossignalclear语句,很遗憾居然就是一个定义没有内容。查看oswaitsignal定义,关键语句如下:if(xTaskNotifyWait( 0,(uint32_t) signals, (uint32_t *)&ret.value.signals, ticks) != pdTRUE),查看xTaskNotifyWait定义,发现那个0就是执行前要清零的信号位,0位当然什么都不清除,他妈妈的这个封装真的有问题,一直以为是自己错了,请看freertos的解释:
ulBitsToClearOnEntry           Any bits set in ulBitsToClearOnEntry will be cleared in the calling RTOS task's notification value on entry to the xTaskNotifyWait() function (before the task waits for a new notification) provided a notification is not already pending when xTaskNotifyWait() is called.
For example, if ulBitsToClearOnEntry is 0x01, then bit 0 of the task's notification value will be cleared on entry to the function.

Setting ulBitsToClearOnEntry to 0xffffffff (ULONG_MAX) will clear all the bits in the task's notification value, effectively clearing the value to 0.
很清楚地解释了这一点,难道cmisis封装时不能添加一个变量吗?
由于我的程序不需要保留signal位,所以最简单的办法就是直接修改cmsis_os这个程序,把0直接换成0xffffffff,如下if(xTaskNotifyWait( 0xffffffff,(uint32_t) signals, (uint32_t *)&ret.value.signals, ticks) != pdTRUE)。问题解决。
Tony_Duan 回答时间:2016-3-6 00:23:43
原来一直以为在外企有一定会让你在适合你的岗位工作,妈妈的我们的设备明显很原始,我的项目应该能让设备有很大提升,可是白人的RD要自己做,到现在没一点眉目,弄得哥也没兴趣继续做了,只是把项目当成一个自娱自乐学习的工具了
阿莫斯 回答时间:2017-5-23 16:51:45
Tony_Duan 发表于 2015-10-6 23:45
osEvent eve;
eve=osSignalWait(0,osWaitForever);
本来是可以根据信号不同在一个任务中执行不同的功能,前 ...
  1. xTaskNotifyWait( uint32_t ulBitsToClearOnEntry, uint32_t ulBitsToClearOnExit, uint32_t *pulNotificationValue, TickType_t xTicksToWait )
复制代码


osEvent osSignalWait (int32_t signals, uint32_t millisec)封装的函数
xTaskNotifyWait( 0,(uint32_t) signals, (uint32_t *)&ret.value.signals, ticks)

如果你进去的时候清零了,有效位被清除了,那么你接下来怎么判断标志位?
osSignalWait ()函数虽然进入的时候没有清理,但是出来的时候完成了清零,所有封装是没有问题的!
秋水之下 回答时间:2017-7-4 09:45:29
qiu-368230 发表于 2015-9-10 08:54
如果CMSIS_OS 就是封装后的freeRTos,那么CMSIS-RTOS RTX呢,他们三个之间到底是什么关系啊,谢谢  ...

CMSIS OS 不单单封装了freeRTOS 还封装了 RTX UCOS 等,都统一用CMSIS OS API吧,这样大家移植都方便,不要在关心什么平台了 ARM收购KEIL后的大功劳
黑皮男 回答时间:2017-7-6 19:11:52
看源码吧,基本都差不多
jcx0324 回答时间:2017-8-25 15:19:26
貌似ucos退出了

所属标签

相似问题

关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
STM32N6 AI生态系统
STM32MCU,MPU高性能GUI
ST ACEPACK电源模块
意法半导体生物传感器
STM32Cube扩展软件包
关注我们
微信公众号二维码 微信公众号
手机版二维码 手机版