一、开发环境

开发板:野火stm32f407
系统:rt-thread V4.1.1

二、链接脚本配置

; *************************************************************
; *** Scatter-Loading Description File generated by uVision ***
; *************************************************************LR_IROM1 0x08000000 0x00100000  {    ; load region size_regionER_IROM1 0x08000000 0x00100000  {  ; load address = execution address*.o (RESET, +First)*(InRoot$$Sections).ANY (+RO)}RW_IRAM1 0x20000000 0x00020000  {  ; RW data.ANY (+RW +ZI)}RW_IRAM2 0x10000000 0x00010000  {  ; RW data*(.CCM_RAM)}
}

具体配置可参考文章链接

https://mp.weixin.qq.com/s/s_CHsM7ykF6-n2dVwfaGUQ

三、测试代码

使用单片机的CCNM内存创建变量和线程,打印变量和线程的地址信息,使用指令查看主RAM的信息。直接贴测试代码,如下:

/** Copyright (c) 2006-2021, RT-Thread Development Team** SPDX-License-Identifier: Apache-2.0** Change Logs:* Date           Author       Notes* 2018-11-06     SummerGift   first version* 2018-11-19     flybreak     add stm32f407-atk-explorer bsp*/#include <rtthread.h>
#include <rtdevice.h>
#include <board.h>/* defined the LED0 pin: PF7 */
#define LED0_PIN    GET_PIN(F, 7)/* 定义在CCM RAM里面的变量 */ 
//__attribute__((section (".CCM_RAM"))) uint32_t BufInfo[10];
//__attribute__((section (".CCM_RAM"))) uint16_t Count=5;//可以定义初值uint32_t BufInfo[10] __attribute__((section (".CCM_RAM")));uint16_t Count __attribute__((section (".CCM_RAM"))) =5;//可以这样定义初值uint16_t CNT __attribute__((section(".CCM_RAM"), used));//使用 __attribute__((used)) 确保变量不被优化掉
__attribute__((section (".CCM_RAM"),used)) uint16_t NUM=5;//使用 __attribute__((used)) 确保变量不被优化掉/* 定义在CCM RAM里面的线程 */ 
#if defined(RT_VERSION_CHECK) && (RTTHREAD_VERSION >= RT_VERSION_CHECK(5, 0, 1))rt_align(RT_ALIGN_SIZE)
#elseALIGN(RT_ALIGN_SIZE)
#endif
//__attribute__((section (".CCM_RAM"))) static char thread1_stack[1024*60];
//__attribute__((section (".CCM_RAM"))) static struct rt_thread thread1;static char thread1_stack[1024*2] __attribute__((section (".CCM_RAM")));static struct rt_thread thread1 __attribute__((section (".CCM_RAM")));#if defined(RT_VERSION_CHECK) && (RTTHREAD_VERSION >= RT_VERSION_CHECK(5, 0, 1))rt_align(RT_ALIGN_SIZE)
#elseALIGN(RT_ALIGN_SIZE)
#endifstatic char thread2_stack[1024*2] __attribute__((section (".CCM_RAM")));static struct rt_thread thread2 __attribute__((section (".CCM_RAM")));/* 定义在CCM RAM里面的信号量 */ 
__attribute__((section (".CCM_RAM"))) static struct rt_semaphore test_sem;/* 线程 1 入口 */
static void thread1_entry(void *param)
{rt_uint32_t count = 0;rt_kprintf("count_addr= %x\r\n",&count);rt_uint32_t buf[10];for(int i=0;i<10;i++){rt_kprintf("buf[%d]_addr= %x\r\n",i,&buf[i]);}/* 线程 1 拥有较高的优先级,以抢占线程 1 而获得执行 */static rt_err_t result;for (;;){/* 永久方式等待信号量,获取到信号量,则执行 number 自加的操作 */result = rt_sem_take(&test_sem, RT_WAITING_FOREVER);if ( result == RT_EOK){/* 线程 1 打印计数值 */rt_kprintf("thread1 count: %d\n", count++);}else{rt_kprintf("thread 1 result is %d\n", result);}}/* 线程 1 运行结束后也将自动被系统脱离 */}/* 线程 2 入口 */
static void thread2_entry(void *param)
{rt_uint32_t count = 0;rt_kprintf("count_addr2= %x\r\n",&count);rt_uint32_t buf[10];for(int i=0;i<10;i++){rt_kprintf("buf[%d]_addr2= %x\r\n",i,&buf[i]);}for (;;){/* 线程 1 打印计数值 */rt_kprintf(" release test_sem.\n");rt_sem_release(&test_sem);rt_thread_mdelay(10000);}/* 线程 1 运行结束后也将自动被系统脱离 */}int main(void)
{/* set LED0 pin mode to output */rt_pin_mode(LED0_PIN, PIN_MODE_OUTPUT);Count++;for(int i=0;i<10;i++){rt_kprintf("BufInfo[%d]_addr= %x\r\n",i,&BufInfo[i]);}BufInfo[0] = Count;rt_kprintf("CCMBuf1_addr= %x, BufInfo[0] = %d\r\n",BufInfo,BufInfo[0]);rt_kprintf("CCMCount_addr= %x, Count = %d\r\n",&Count,Count);   rt_kprintf("CNT= %x, CNT = %d\r\n",&CNT,CNT);  rt_kprintf("NUM= %x, NUM = %d\r\n",&NUM,NUM);  rt_thread_mdelay(5000);  rt_kprintf("intput free\r\n");  rt_thread_mdelay(10000);rt_sem_init(&test_sem, "testSem",     0,      RT_IPC_FLAG_PRIO);rt_kprintf("test_sem_addr= %x\r\n",&test_sem); rt_thread_mdelay(10000);/* 初始化线程 1,名称是 thread1,入口是 thread1_entry */rt_thread_init(&thread1,"thread1",thread1_entry,RT_NULL,&thread1_stack[0],sizeof(thread1_stack),25, 5);rt_thread_startup(&thread1);rt_kprintf("thread1_addr= %x\r\n",&thread1);  rt_kprintf("thread1_stack_addr= %x\r\n",thread1_stack);   rt_thread_mdelay(10000);/* 初始化线程 2,名称是 thread2,入口是 thread2_entry */rt_thread_init(&thread2,"thread2",thread2_entry,RT_NULL,&thread2_stack[0],sizeof(thread2_stack),25, 5);rt_thread_startup(&thread2);rt_kprintf("thread2_addr= %x\r\n",&thread2);  rt_kprintf("thread2_stack_addr= %x\r\n",thread2_stack);                  rt_thread_mdelay(10000);                rt_kprintf("intput free\r\n"); rt_thread_mdelay(10000);while (1){rt_pin_write(LED0_PIN, PIN_HIGH);rt_thread_mdelay(500);rt_pin_write(LED0_PIN, PIN_LOW);rt_thread_mdelay(500);}
}

测试结果:
打印变量的信息
在这里插入图片描述

打印线程的信息
在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若转载,请注明出处:http://www.pswp.cn/web/88088.shtml
繁体地址,请注明出处:http://hk.pswp.cn/web/88088.shtml
英文地址,请注明出处:http://en.pswp.cn/web/88088.shtml

如若内容造成侵权/违法违规/事实不符,请联系英文站点网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【UnityAssetBundle】AB包卸载资源

AB包的卸载高效稳定游戏开发的强制要求&#xff0c;它解决了资源管理中的内存泄漏问题&#xff0c;为动态的内容加载、热更新、大型世界的构建提供了内存保障&#xff0c;最终提升了游戏性能、稳定性和用户体验。卸载资源方式一&#xff08;推荐使用&#xff09;&#xff1a;卸…

【万字长文】深度学习2 yolov5修改为自己的数据集

数据预处理 使用labelme可以直接导出适用于yolo模型的txt文本数据&#xff0c;也可以直接导出默认的json数据结构&#xff0c;后面我会提供代码进行转换。自行进行标注&#xff0c;图片与标注一一对应&#xff0c;更多要求不赘述。因为我做最简单的检索模型&#xff0c;不做切…

ubuntu18编译RealSense SDK 2.0

参考文章&#xff1a;https://dev.intelrealsense.com/docs/compiling-librealsense-for-linux-ubuntu-guide1、安装依赖 sudo apt-get update && sudo apt-get upgrade && sudo apt-get dist-upgrade sudo apt-get install libssl-dev libusb-1.0-0-dev libud…

算法学习笔记:9.Kruskal 算法——从原理到实战,涵盖 LeetCode 与考研 408 例题

在图论的众多算法中&#xff0c;Kruskal 算法以其简洁高效的特性&#xff0c;成为求解最小生成树&#xff08;Minimum Spanning Tree&#xff0c;MST&#xff09;的经典方法。无论是在通信网络的优化设计、电路布线的成本控制&#xff0c;还是在计算机考研 408 的备考过程中&am…

Vue+Openlayers加载OSM、加载天地图

文章目录1. 介绍2. 加载底图2.1 加载默认OSM地图2.2 加载天地图1. 介绍 Openlayers官网&#xff1a;https://openlayers.org/ 安裝依赖&#xff1a;npm i ol 2. 加载底图 参考博客&#xff1a; vueopenlayers环境配置&#xff1a;https://blog.csdn.net/cuclife/article/det…

Python处理电子表格文件库之pyexcel使用详解

概要 pyexcel是一个功能强大的Python第三方库,专门用于处理各种格式的电子表格文件。核心价值在于提供了统一的接口来读取、写入和操作Excel、CSV、ODS等多种电子表格格式,极大简化了数据处理工作流程。与传统的单一格式处理库不同,pyexcel采用了插件化架构,使开发者能够通…

【网络安全】恶意 Python 包“psslib”仿冒 passlib,可导致 Windows 系统关闭

文章目录恶意 Python 包“psslib”仿冒 passlib如何避免psslib的威胁恶意 Python 包“psslib”仿冒 passlib Socket 的威胁研究团队发现了一个名为 psslib 的恶意 Python 包&#xff0c;旨在以提供密码安全功能为幌子突然关闭 Windows 系统。 该软件包由威胁行为者使用别名 u…

ai之对接电信ds后端服务,通过nginx代理转发https为http,对外请求,保持到达第三方后请求头不变

前置环境&#xff1a; 在微信小程序中嵌入H5页面&#xff08;智能客服&#xff09;&#xff0c;需要让h5页面在https的域名服务器上。即通过 nginx 部署成web服务&#xff0c;还得配置域名和端口443访问。电信的第三方deepseek服务 &#xff0c;只接收http请求&#xff0c;暂未…

第十四节:Vben Admin 最新 v5.0 (vben5) + Python Flask 快速入门 - Flask 后端 生产部署讲解

Vben5 系列文章目录 💻 基础篇 ✅ 第一节:Vben Admin 最新 v5.0 (vben5) + Python Flask 快速入门 ✅ 第二节:Vben Admin 最新 v5.0 (vben5) + Python Flask 快速入门 - Python Flask 后端开发详解(附源码) ✅ 第三节:Vben Admin 最新 v5.0 (vben5) + Python Flask 快速入…

Unity开发如何解决iOS闪退问题

一、iOS闪退常见原因及排查方法1. 内存问题&#xff08;最常见原因&#xff09; 症状表现&#xff1a; 设备发热后闪退 加载大型场景时崩溃 控制台出现EXC_RESOURCE RESOURCE_TYPE_MEMORY日志 解决方案&#xff1a; // 内存监控代码 void Update() { Debug.Log($"内存使用…

【机器学习笔记 Ⅲ】5 强化学习

强化学习&#xff08;Reinforcement Learning, RL&#xff09; 强化学习是机器学习的一个分支&#xff0c;其核心思想是让智能体&#xff08;Agent&#xff09;通过与环境&#xff08;Environment&#xff09;的交互学习最优策略&#xff08;Policy&#xff09;&#xff0c;以最…

pytorch深度学习-卷积神经网络CNN-MNIST-gpu加速

一、为什么需要 CNN&#xff1f;从图像识别的 “麻烦” 说起假设你想让电脑识别一张图片里有没有猫。 如果用传统神经网络&#xff1a;一张 100100 的彩色图片&#xff0c;有 100100330000 个像素点&#xff0c;每个像素点都是一个输入神经元。传统网络需要每个输入神经元和隐藏…

【阿里巴巴JAVA开发手册】IDE的text file encoding设置为UTF-8; IDE中文件的换行符使用Unix格式,不要使用Windows格式。

问题&#xff1a;当使用 IDEA SSH 远程开发时&#xff0c;SFTP 同步的 Windows 本地编辑的 config/plugin_config 文件文本内容中 “换行符”与 Unix、Linux 的文件文本内容换行符字符集不一致&#xff0c;导致 docker 容器中自定义 /opt/seatunnel/bin/install_plugin 在执行以…

自动驾驶ROS2应用技术详解

自动驾驶ROS2应用技术详解 目录 自动驾驶ROS2节点工作流程自动驾驶感知融合技术详解多传感器数据同步技术详解ROS2多节点协作与自动驾驶系统最小节点集 1. 自动驾驶ROS2节点工作流程 1.1 感知输出Topic的后续处理 在自动驾驶系统中&#xff0c;感知节点输出的各种Topic会被…

Redis底层实现原理之订阅发布机制

文章目录1. 通知类型2. 实现原理2.1 Pub/Sub2.1.1 基础知识点2.1.2 频道和订阅者的存储通知原理2.1.3 键空间通知2.1.4 客户端消费2.1.5 缺陷2.2 Redis Stream2.2.1 基础知识点2.2.2 基础数据结构2.2.3 消费者组管理2.2.4 消息和消费者持久化2.2.5 消息生产和消费2.2.6 消费者拉…

【MATLAB代码】AOA与TDOA混合定位例程,自适应基站数量,二维,可调节锚点数量。订阅专栏后,可直接查看matlab源代码

本文给出一个matlab代码,用于在二维平面上,使用AOA的角度测量和TDOA的到达时间差的测量,来达到对未知点的精确定位。最后输出定位示意图、真实点坐标、仅AOA定位坐标与误差、仅TDOA定位的坐标与误差、AOA+TDOA混合定位的坐标与误差。订阅专栏后可直接查看源代码,粘贴到MATL…

Node.js 所有主要版本的发布时间、稳定版本(Stable)和长期支持版本(LTS) 的整理

以下是 Node.js 所有主要版本的发布时间、稳定版本&#xff08;Stable&#xff09;和长期支持版本&#xff08;LTS&#xff09; 的整理&#xff0c;涵盖从早期版本到当前最新版本的信息。 &#x1f4c5; Node.js 版本发布规律 每 6 个月发布一个新主版本&#xff08;偶数月&am…

【牛客刷题】小红的v三元组

文章目录 一、题目介绍1.1 题目描述1.2 输入描述1.3 输出描述1.4 示例二、解题思路2.1 核心算法设计2.2 性能优化关键2.3 算法流程图三、算法实现四、算法分析4.1 时间复杂度4.2 空间复杂度4.3 正确性证明五、为什么选择离散化+树状数组的解法?5.1 问题本质分析5.2 解法设计思…

c语言学习_函数递归

今天学习函数递归。函数递归通俗来说就是函数自己调用自己&#xff0c;递归的主要思考方式在于&#xff1a;把大事化小。例子&#xff1a;接受一个整型值&#xff0c;按照顺序打印它的每一位。void print(unsigned int n) {if (n > 9){print(n / 10);}printf("%d"…

Bash与Zsh与Fish:在Linux中你应该使用哪个Shell

命令行 shell 是与操作系统交互的重要工具&#xff0c;使用户能够高效地执行命令、自动化任务和运行脚本。 虽然有各种外壳选项可供选择&#xff0c;但Bash、Zsh和Fish作为最受欢迎的选择脱颖而出&#xff0c;每种都提供独特的功能&#xff0c;因此理解它们的差异对于选择适合…