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

哪位有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管理
行使您的权利
关注我们
st-img 微信公众号
st-img 手机版