[nrf51][nrf52] 移植RTX或者FreeRTOS需要注意的问题

发布者:zhaodawei617最新更新时间:2022-08-24 来源: csdn关键字:nrf51  nrf52  FreeRTOS 手机看文章 扫描二维码
随时随地手机看文章

一、 使用MDK中的cmsis_os接口,需要查看以下代码是否被启用


/*

  Setup SVC to reset value.

*/

__STATIC_INLINE void SVC_Setup(void)

{

#if (__ARM_ARCH_7A__ == 0U)

    /* Service Call interrupt might be configured before kernel start     */

    /* and when its priority is lower or equal to BASEPRI, svc intruction */

    /* causes a Hard Fault.                                               */

    NVIC_SetPriority(SVCall_IRQn, 0U);

#endif

}

 

/* Ensure SVC priority is at the reset value */

SVC_Setup();

原因:由于协议栈中也使用了SVC,这导致APP层调用SVC_Setup();导致协议栈异常。

二、 nrf52带BLE协议栈不能使用RTX5或者RTX4


原因大致跟注意(一)差不多


1. 在 RTX 和 Freertos 之外,Freertos 将是目前最好的解决方案。我们暂时在 SDK 中将 RTX 端口设置为“实验性”,因为它还不是 100% 稳定。


2.  RTOS 与我们的软设备同时运行的想法在其核心是不理想的。软设备必须始终具有中断其他任务和运行时序关键协议任务的能力。这使得 RTOS 无法创建不能被中断的安全临界区。


3. 软设备在 nRF52 上启用 FPU 的情况下启用(无意,但这是提出的,将由软设备团队修复)如果启用了 FPU,则需要以不同方式处理 MBR 和软设备中的 SVC 处理程序。如果不与BLE softdevice 结合使用,RTX就能正常使用。


4. 原因是软件设备的 SVC 代码在启用 FPU 时也使用 MSP。对于 RTX 和软件设备,这会导致 MSP 冲突。


官方解释:当将 RTX 从 nRF51 移植到 nRF52 时,RTX 与软设备一起不再稳定。这是因为两者之间的架构差异。在我们使用新形式的临界区和无滴答空闲处理从头开始重新构建 nRF52 RTX 端口之前,支持已被移除。


三、 ANT协议栈问题


在 nRF51 兼容性矩阵中看到的,SDK 12.3.0 不支持 S310 软设备,支持该软设备的最后一个 SDK 是 SDK 10.0.0。


应该可以将 SDK 12.3 中的示例更改为使用 S310 软设备的 API,但没有可用的示例来说明这一点。S310 v3.0.0基于S110 v8.0.0和S210 v5.0.0。SDK 10.0.0 同时支持 S310 和 RTX,因此如果这是您要开发的应用程序,它应该是您应用程序的最佳起点。RTX 应该可以和 S110 softdevice 一起使用。


nRF SDK 不太支持 RTX(SDK 12.x 中仅支持 nRF51,并且在 SDK 13 中完全删除了对 nRF51 支持的支持)。我建议查看 FreeRTOS,它在最新的 SDK 中同时支持 nRF51 和 nRF52 系列。SDK v10.0.0以后的nRF51系列不支持ANT,如果要使用以后的SDK,需要更改softdevice调用或者切换到nRF52系列。 


四、 NRF_CLOCK->EVENTS_LFCLKSTARTED 一直循环死等


1. 在 RTX_Conf_CM.c 的 os_tick_init() 中有一个循环,它不会结束。


while (NRF_CLOCK->EVENTS_LFCLKSTARTED == 0)

 {

 Do nothing.

 }


因为上面的行试图用晶体启动低频时钟,而你没有一个,所以它永远不会启动。或者改为内部时钟。(将 CLOCK_LFCLKSRC_SRC_Xtal 更改为 CLOCK_LFCLKSRC_SRC_Synth)

关键字:nrf51  nrf52  FreeRTOS 引用地址:[nrf51][nrf52] 移植RTX或者FreeRTOS需要注意的问题

上一篇:NORDIC 烧录BLE协议栈后不能用JLINK仿真bootloader问题及修改方案
下一篇:[nrf51][nrf52]设置快速广播和慢速广播

推荐阅读最新更新时间:2024-11-11 11:04

关于STM32F103C8T6移植FreeRTOS时进入HardFault_Handler的解决方案
最近在学习FreeRTOS的使用,在移植第一个工程的过程中就出现了问题,在按照教程进行一直完成之后,程序不能成功进行调度和运行,经仿真发现程序进入的HardFault_Handler的死循环中。 查找了很多资料以及各种方案才找到解决方案: 将FreeRTOSConfig.h 中的系统总的堆栈空间configTOTAL_HEAP_SIZE 调小就好了,其原因是C8T6芯片内部RAM较小,不能成功申请到那么多的内存空间才报错的。
[单片机]
STM32CubeMX学习笔记——FreeRTOS_任务挂起与继续
Github https://github.com/HaHaHaHaHaGe/Planof2019_half/tree/master/Course_Project/FreeRTOS/Class02_SuspendResume 简介 任务挂起与继续的作用,用于暂停运行某些任务与继续运行某些任务。就像用视频播放器看电影的播放按键与暂停按键一样简单。 在STM32CubeMX上配置FreeRTOS非常的简单,几乎不需要做任何操作,只需要勾选 移植FreeRTOS就成功了,关于在非Cube上的RTOS配置文件内的相关内容,也在下方的Configuration栏中给好了 所有的配置都可以在这里完成 任务创建 有别于在没有
[单片机]
STM32CubeMX学习笔记——<font color='red'>FreeRTOS</font>_任务挂起与继续
STM32中断,及FreeRTOS中断优先级配置
很多朋友对中断的一些知识还是不了解,今天就写点关于Cortex-M3处理器中断相关,以及FreeRTOS中断优先级配置的内容。 1写在前面 写本文之前,先写点相关的扩展内容。 STM32属于ARM中Cortex-M系列处理器,比如:STM32F1数据Cortex-M3,STM32F7数据Cortex-M7。 可以参看我之前分享文章: 从Cortex-M到Cortex-A认识ARM处理器 ,了解一下关于ARM处理器的种类。 本文主要结合Cortex-M3下面STM32F1系列处理器为例来讲述中断控制相关内容。而Cortex-M其它系列,或者说STM32其它系列关于中断的内容类似。 Cortex
[单片机]
STM32中断,及<font color='red'>FreeRTOS</font>中断优先级配置
在S3C2440上移植FreeRTOS
简介: FreeRTOS-Kernel V10.5.1 | gcc version 6.5.0 (crosstool-NG 1.24.0) 在官方已有的ARM7_LPC2000的移植模板文件基础上修改(FreeRTOS-Kernel/portable/GCC/ARM7_LPC2000)使用heap4。 移植调度器: 初始化一个定时器用于提供系统心跳时钟。选择初始化定时器4的周期为1ms,配置为fiq。在prvSetupTimerInterrupt()中调用初始化函数如下图: 在vPortISRStartFirstTask()中添加汇编函数如下:目的是在启动第一个函数前切换处理器到特殊模式,简而言之就是要切换到非系统或用户模式,因
[单片机]
在S3C2440上<font color='red'>移植</font><font color='red'>FreeRTOS</font>
STM32F407_FreeRTOS_LwIP调试详解一:Cube_MX生成工程
概要:本次使用的硬件平台是STM32F407ZGT6的板子,外加一块LAN8742A网络模块,先上一张全家福: 软件平台使用的是CubeMX V4.22及Keil V5.21.10软件。 LwIP的架构 LwIP API的三种方式: 1、使用CubeMX新建工程,如下图所示: 2、选择芯片型号:本开发板使用的是STM32F407ZGT6芯片; 3、IO口选择 3.1、选择并使能RCC时钟源为:HSE 3.2、选择并使能ETH接口为:RMII类型接口,本次使用的是LAN8742A模块,是RMII类型接口 3.3、选择并使能LWIP协议栈: 3.4、选择并使能FreeRTOS操作系
[单片机]
STM32F407_<font color='red'>FreeRTOS</font>_LwIP调试详解一:Cube_MX生成工程
STM32+FreeRTOS+CUBEMX_学习笔记(四)按键输入
前言 gpio输入模式也就是简单的读取gpio的电平 操作 1、首先在cube中将gpio设置为输入模式 2、函数讲解: HAL_GPIO_ReadPin(KEY1_GPIO_Port,KEY1_Pin);//这个函数用来读取pin的高低电平值 /** * @brief Read the specified input port pin. * @param GPIOx where x can be (A..F) to select the GPIO peripheral for STM32F0 family * @param GPIO_Pin specifies the port bit to read.
[单片机]
STM32+<font color='red'>FreeRTOS</font>+CUBEMX_学习笔记(四)按键输入
[nrf52][SDK17] 如何修改BLE_MAC地址
关键部分: ble_gap_addr_t ble_mac_addr = {0}; sd_ble_gap_addr_get(&ble_mac_addr); // 先获取ble 当前mac地址 ble_mac_addr.addr ++; //地址加1. 或者取随机数。数组大小6位 sd_ble_gap_addr_set(&ble_mac_addr); //变更ble mac地址 使用方法: /**@brief Application main function. */ int main(void) { bool erase_bonds; ble_gap_addr_t ble_mac_
[单片机]
小广播
设计资源 培训 开发板 精华推荐

最新单片机文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

换一换 更多 相关热搜器件

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

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