硬汉嵌入式论坛

 找回密码
 立即注册
查看: 2942|回复: 9
收起左侧

[FreeRTOS] SystemView 移植到 freertos 上,出现 xCopyPosition 这个没有定义错误 ?

[复制链接]

610

主题

3050

回帖

4900

积分

至尊会员

积分
4900
发表于 2020-4-3 15:50:06 | 显示全部楼层 |阅读模式
SystemView 移植到 freertos 上,出现 xCopyPosition 这个没有定义错误 ?


queus-xCopyPosition-err.png





回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
106746
QQ
发表于 2020-4-3 18:29:06 | 显示全部楼层
回复

使用道具 举报

610

主题

3050

回帖

4900

积分

至尊会员

积分
4900
 楼主| 发表于 2020-4-3 23:25:55 | 显示全部楼层
本帖最后由 hpdell 于 2020-4-4 08:26 编辑

终于搞定了啊,

貌似需要把 FreeRTOSConfig.h 里面的 红
#define configUSE_QUEUE_SETS                                        0    定义为 0 即可, ( 这个地方,如果没有使用 SystemVIew 设置为1 是完全没有任何问题的, 但是使用 了 SystemView 后,貌似就只能设置为 0 了, 有哪位大神知道是怎么回事吗 ????????? )

另外, SystemView 版本智能使用 v2.52a 版本就可以了, 如果使用 v3.07/v3.10 版本都不行, 他奶奶的,折腾了这么久,

视频地址
https://v.youku.com/v_show/id_XNDYxODMwMTIzNg==.html

图片:
sysRtos.png

从上图中看,貌似 有几个中断优先级重复了, 这个会不会有什么影响啊 ??

另外还有显示刷新 貌似占用了太多的时间,

还有就是这个 SystemView 查看 Stack Information  信息栏里面的数据,
以 Tmr Svc 为例, 前面的 230 表示是使用了 230 字节码 ??  后面 @0x2400a310 是起始地址对吧 ??

回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
106746
QQ
发表于 2020-4-4 09:54:58 | 显示全部楼层
hpdell 发表于 2020-4-3 23:25
终于搞定了啊,

貌似需要把 FreeRTOSConfig.h 里面的 红

1、同优先级任务,不影响。
2、GUI任务推荐设置到最低优先级,仅比空闲任务高。
3、任务栈信息显示的不够全面,需要自己手动打印下。

回复

使用道具 举报

610

主题

3050

回帖

4900

积分

至尊会员

积分
4900
 楼主| 发表于 2020-4-4 09:59:43 | 显示全部楼层
eric2013 发表于 2020-4-4 09:54
1、同优先级任务,不影响。
2、GUI任务推荐设置到最低优先级,仅比空闲任务高。
3、任务栈信息显示的不 ...

手动打印是不是需要调用 SEGGER_RTT_printf.c 这个函数的相关函数, 之后就会显示在 SystemView V3.10 Pro 的界面上啦  ??
回复

使用道具 举报

4

主题

35

回帖

47

积分

新手上路

积分
47
发表于 2020-4-12 23:36:22 | 显示全部楼层
我将SystemView V3.10移植到FreeRTOS V10.3上的时候遇到的同样的问题。我对比了一下源代码,应该是FreeRTOS从9.x升级到10.x时的遗留问题。
这次出问题的函数是queue.c文件中的prvNotifyQueueSetContainer()函数,作用是当任务使用 xQueueGenericSend 向属于队列集中队列发送数据时会调用 prvNotifyQueueSetContainer 函数向队列集发送通知消息、以便将队列放入到队列集存储区中、检查是否有任务阻塞在队列集等待接收数据链表。
FreeRTOS 9.x版本的函数定义为:
    static BaseType_t prvNotifyQueueSetContainer( const Queue_t * const pxQueue, const BaseType_t xCopyPosition )
而在FreeRTOS 10.x版本的函数定义为:
    static BaseType_t prvNotifyQueueSetContainer( const Queue_t * const pxQueue )
直接缺失了后面的xCopyPosition ,然后查询这个xCopyPosition 的作用时发现,此参数用来控制消息队列的入队方式。FreeRTOS 9.x版本可以由调用函数配置入队方式,而在10.x版本,直接将此参数写死为:queueSEND_TO_BACK(后向入队)。而SystemView还在调用函数输入的参变量,从而导致输入参数缺失的错误。
解决方法很简单:
修改SEGGER_SYSVIEW_FreeRTOS.h头文件中关于traceQUEUE_SEND( pxQueue )的宏定义,10.x版本源代码为:
#define traceQUEUE_SEND( pxQueue )   SEGGER_SYSVIEW_RecordU32x4(apiID_OFFSET + apiID_XQUEUEGENERICSEND, SEGGER_SYSVIEW_ShrinkId((U32)pxQueue), 0u, 0u, xCopyPosition)
可以修改为:
#define traceQUEUE_SEND( pxQueue )    SEGGER_SYSVIEW_RecordU32(apiID_OFFSET + apiID_XQUEUEGENERICSEND, SEGGER_SYSVIEW_ShrinkId((U32)pxQueue))
或者:
#define traceQUEUE_SEND( pxQueue )   SEGGER_SYSVIEW_RecordU32x4(apiID_OFFSET + apiID_XQUEUEGENERICSEND, SEGGER_SYSVIEW_ShrinkId((U32)pxQueue), 0u, 0u, 0u)
就可以规避此错误了。至于SystemView 要这个消息有啥用,会不会有影响,这个只有开发人员知道了,毕竟上位机软件没公开。
目前看,这么改不影响SystemView V3.10上位机的使用。

SystemView运行图

SystemView运行图


评分

参与人数 1金币 +50 收起 理由
eric2013 + 50 赞一个!

查看全部评分

回复

使用道具 举报

4

主题

35

回帖

47

积分

新手上路

积分
47
发表于 2020-4-12 23:36:59 | 显示全部楼层
我将SystemView V3.10移植到FreeRTOS V10.3上的时候遇到的同样的问题。我对比了一下源代码,应该是FreeRTOS从9.x升级到10.x时的遗留问题。
这次出问题的函数是queue.c文件中的prvNotifyQueueSetContainer()函数,作用是当任务使用 xQueueGenericSend 向属于队列集中队列发送数据时会调用 prvNotifyQueueSetContainer 函数向队列集发送通知消息、以便将队列放入到队列集存储区中、检查是否有任务阻塞在队列集等待接收数据链表。
FreeRTOS 9.x版本的函数定义为:
    static BaseType_t prvNotifyQueueSetContainer( const Queue_t * const pxQueue, const BaseType_t xCopyPosition )
而在FreeRTOS 10.x版本的函数定义为:
    static BaseType_t prvNotifyQueueSetContainer( const Queue_t * const pxQueue )
直接缺失了后面的xCopyPosition ,然后查询这个xCopyPosition 的作用时发现,此参数用来控制消息队列的入队方式。FreeRTOS 9.x版本可以由调用函数配置入队方式,而在10.x版本,直接将此参数写死为:queueSEND_TO_BACK(后向入队)。而SystemView还在调用函数输入的参变量,从而导致输入参数缺失的错误。
解决方法很简单:
修改SEGGER_SYSVIEW_FreeRTOS.h头文件中关于traceQUEUE_SEND( pxQueue )的宏定义,10.x版本源代码为:
#define traceQUEUE_SEND( pxQueue )   SEGGER_SYSVIEW_RecordU32x4(apiID_OFFSET + apiID_XQUEUEGENERICSEND, SEGGER_SYSVIEW_ShrinkId((U32)pxQueue), 0u, 0u, xCopyPosition)
可以修改为:
#define traceQUEUE_SEND( pxQueue )    SEGGER_SYSVIEW_RecordU32(apiID_OFFSET + apiID_XQUEUEGENERICSEND, SEGGER_SYSVIEW_ShrinkId((U32)pxQueue))
或者:
#define traceQUEUE_SEND( pxQueue )   SEGGER_SYSVIEW_RecordU32x4(apiID_OFFSET + apiID_XQUEUEGENERICSEND, SEGGER_SYSVIEW_ShrinkId((U32)pxQueue), 0u, 0u, 0u)
就可以规避此错误了。至于SystemView 要这个消息有啥用,会不会有影响,这个只有开发人员知道了,毕竟上位机软件没公开。
目前看,这么改不影响SystemView V3.10上位机的使用。
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
106746
QQ
发表于 2020-4-13 08:07:12 | 显示全部楼层
BUGvirus 发表于 2020-4-12 23:36
我将SystemView V3.10移植到FreeRTOS V10.3上的时候遇到的同样的问题。我对比了一下源代码,应该是FreeRTOS ...

非常感谢分享。
回复

使用道具 举报

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

本版积分规则

QQ|小黑屋|Archiver|手机版|硬汉嵌入式论坛

GMT+8, 2024-5-3 16:15 , Processed in 0.190405 second(s), 32 queries .

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2023, Tencent Cloud.

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