How to use CCS to debug a running M4F core that was started by Linux?
参考FAQ:AM62x & AM64x: How to use CCS to debug a running M4F core that was started by Linux?
问题记录:
1.使用SD卡启动模式,板上运行Linux。
当Linux系统启动后,9表示M4F core:
am64xx-evm login: root
root@am64xx-evm:~# rpmsg_char_simple -r 9 -n 3
Created endpt device rpmsg-char-9-1035, fd = 3 port = 1024
Exchanging 3 messages with rpmsg device ti.ipc4.ping-pong on rproc id 9 ...Sending message #0: hello there 0!
Receiving message #0: hello there 0!
Sending message #1: hello there 1!
Receiving message #1: hello there 1!
Sending message #2: hello there 2!
Receiving message #2: hello there 2!Communicated 3 messages successfully on rpmsg-char-9-1035TEST STATUS: PASSED
下面的输出怀疑存在问题:
root@am64xx-evm:~# rpmsg_char_simple -r 2 -n 3
Created endpt device rpmsg-char-2-1042, fd = 3 port = 1024
Exchanging 3 messages with rpmsg device ti.ipc4.ping-pong on rproc id 2 ...Sending message #0: hello there 0!
Receiving message #0:
Sending message #1: hello there 1!
Receiving message #1:
Sending message #2: hello there 2!
Receiving message #2:Communicated 3 messages successfully on rpmsg-char-2-1042TEST STATUS: PASSED
接下来在CCS端进行Debug,选择hello_world_am64x-evm_m4fss0-0_nortos_ti-arm-clang例程



运行后卡在0xfd38
结束调试后在Linux终端执行:仍然能正确输出
root@am64xx-evm:~# rpmsg_char_simple -r 9 -n 3
Created endpt device rpmsg-char-9-1573, fd = 3 port = 1024
Exchanging 3 messages with rpmsg device ti.ipc4.ping-pong on rproc id 9 ...Sending message #0: hello there 0!
Receiving message #0: hello there 0!
Sending message #1: hello there 1!
Receiving message #1: hello there 1!
Sending message #2: hello there 2!
Receiving message #2: hello there 2!Communicated 3 messages successfully on rpmsg-char-9-1573TEST STATUS: PASSED
接下来采用Load Program的方式:可以正确加载程序并输出

但是在Linux终端执行,程序会卡死
root@am64xx-evm:~# rpmsg_char_simple -r 9 -n 3
Created endpt device rpmsg-char-9-1720, fd = 3 port = 1024
Exchanging 3 messages with rpmsg device ti.ipc4.ping-pong on rproc id 9 ...Sending message #0: hello there 0!

正确做法:
-
在CCS中构建remote core project(ipc_rpmsg_echo_linux_am64x-evm_m4fss0-0_freertos_ti-arm-clang)
-
将生成的.out文件拷贝到Linux filesystem下的/lib/firmware,并更新links。
root@am64xx-evm:~# head /sys/class/remoteproc/remoteproc*/name ==> /sys/class/remoteproc/remoteproc0/name <==5000000.m4fss //可以确定M4F的remoteproc是0 ... root@am64xx-evm:~# echo stop > /sys/class/remoteproc/remoteproc0/state [ 263.325676] remoteproc remoteproc0: stopped remote processor 5000000.m4fssroot@am64xx-evm:/lib/firmware# ln -sf /lib/firmware/ipc_rpmsg_echo_linux_am64x-evm_m4fss0-0_freertos_ti-arm-clang.out am64-mcu-m4f0_0-fwroot@am64xx-evm:/lib/firmware# ls -l /lib/firmware/ total 32452lrwxrwxrwx 1 root root 79 Dec 14 12:22 am64-mcu-m4f0_0-fw -> /lib/firmware/ipc_rpmsg_echo_linux_am64x- evm_m4fss0-0_freertos_ti-arm-clang.out -
重启EVM,并测试RPMsg example is running properly
root@am64xx-evm:~# rpmsg_char_simple -r 9 -n 3 Created endpt device rpmsg-char-9-1034, fd = 3 port = 1024 Exchanging 3 messages with rpmsg device ti.ipc4.ping-pong on rproc id 9 ...Sending message #0: hello there 0! Receiving message #0: hello there 0! Sending message #1: hello there 1! Receiving message #1: hello there 1! Sending message #2: hello there 2! Receiving message #2: hello there 2!Communicated 3 messages successfully on rpmsg-char-9-1034TEST STATUS: PASSED -
启动AM64 Target Configuration. Connect to the core BLAZAR_Cortex_M4F_0, Load Symbols

在这里打断点,并启动程序:

并在linux端启动:

在CCS里单步运行可以看到,Linux同步输出

代码解析:
main.c
#include <stdlib.h>
#include <kernel/dpl/DebugP.h>
#include "ti_drivers_config.h"
#include "ti_board_config.h"
#include "FreeRTOS.h"
#include "task.h"#define MAIN_TASK_PRI (configMAX_PRIORITIES-1)//代表最高优先级#define MAIN_TASK_SIZE (16384U/sizeof(configSTACK_DEPTH_TYPE))//4096
StackType_t gMainTaskStack[MAIN_TASK_SIZE] __attribute__((aligned(32)));StaticTask_t gMainTaskObj;
TaskHandle_t gMainTask;void ipc_rpmsg_echo_main(void *args);void freertos_main(void *args)
{ipc_rpmsg_echo_main(NULL);vTaskDelete(NULL);
}int main(void)
{/* init SOC specific modules */System_init();Board_init();/* This task is created at highest priority, it should create more tasks and then delete itself */gMainTask = xTaskCreateStatic( freertos_main, /* Pointer to the function that implements the task. */"freertos_main", /* Text name for the task. This is to facilitate debugging only. */MAIN_TASK_SIZE, /* Stack depth in units of StackType_t typically uint32_t on 32b CPUs */NULL, /* We are not using the task parameter. */MAIN_TASK_PRI, /* task priority, 0 is lowest priority, configMAX_PRIORITIES-1 is highest */gMainTaskStack, /* pointer to stack base */&gMainTaskObj ); /* pointer to statically allocated task object memory */configASSERT(gMainTask != NULL);/* Start the scheduler to start the tasks executing. */vTaskStartScheduler();/* The following line should never be reached because vTaskStartScheduler()will only return if there was not enough FreeRTOS heap memory available tocreate the Idle and (if configured) Timer tasks. Heap management, andtechniques for trapping heap exhaustion, are described in the book text. */DebugP_assertNoLog(0);return 0;
}
ipc_rpmsg_echo.c
#include <stdio.h>
#include <string.h>
#include <inttypes.h>
#include <kernel/dpl/ClockP.h>
#include <kernel/dpl/DebugP.h>
#include <kernel/dpl/TaskP.h>
#include <drivers/ipc_notify.h>
#include <drivers/ipc_rpmsg.h>
#include "ti_drivers_open_close.h"
#include "ti_board_open_close.h"/* This example shows message exchange bewteen Linux and RTOS/NORTOS cores.* This example also does message exchange between the RTOS/NORTOS cores themselves** The Linux core initiates IPC with other core's by sending it a message.* The other cores echo the same message to the Linux core.** At the same time all RTOS/NORTOS cores, also send messages to each others* and reply back to each other. i.e all CPUs send and recevive messages from each other** This example can very well have been NORTOS based, however for convinience* of creating two tasks to talk to two clients on linux side, we use FreeRTOS* for the same.*//** Remote core service end point** pick any unique value on that core between 0..RPMESSAGE_MAX_LOCAL_ENDPT-1* the value need not be unique across cores** The service names MUST match what linux is expecting*/
/* This is used to run the echo test with linux kernel */
#define IPC_RPMESSAGE_SERVICE_PING "ti.ipc4.ping-pong"
#define IPC_RPMESSAGE_ENDPT_PING (13U)/* This is used to run the echo test with user space kernel */
#define IPC_RPMESSAGE_SERVICE_CHRDEV "rpmsg_chrdev"
#define IPC_RPMESSAGE_ENDPT_CHRDEV_PING (14U)/* Use by this to receive ACK messages that it sends to other RTOS cores */
#define IPC_RPMESSAGE_RNDPT_ACK_REPLY (11U)/* maximum size that message can have in this example */
#define IPC_RPMESSAGE_MAX_MSG_SIZE (96u)/** Number of RP Message ping "servers" we will start,* - one for ping messages for linux kernel "sample ping" client* - and another for ping messages from linux "user space" client using "rpmsg char"*/
#define IPC_RPMESSAGE_NUM_RECV_TASKS (2u)/* RPMessage object used to recvice messages */
RPMessage_Object gIpcRecvMsgObject[IPC_RPMESSAGE_NUM_RECV_TASKS];/* RPMessage object used to send messages to other non-Linux remote cores */
RPMessage_Object gIpcAckReplyMsgObject;/* Task priority, stack, stack size and task objects, these MUST be global's */
#define IPC_RPMESSAFE_TASK_PRI (8U)
#define IPC_RPMESSAFE_TASK_STACK_SIZE (8*1024U)
uint8_t gIpcTaskStack[IPC_RPMESSAGE_NUM_RECV_TASKS][IPC_RPMESSAFE_TASK_STACK_SIZE] __attribute__((aligned(32)));
TaskP_Object gIpcTask[IPC_RPMESSAGE_NUM_RECV_TASKS];/* number of iterations of message exchange to do */
uint32_t gMsgEchoCount = 100000u;
/* non-Linux cores that exchange messages among each other */
#if defined (SOC_AM64X)
uint32_t gRemoteCoreId[] = {CSL_CORE_ID_R5FSS0_0,CSL_CORE_ID_R5FSS0_1,CSL_CORE_ID_R5FSS1_0,CSL_CORE_ID_R5FSS1_1,CSL_CORE_ID_M4FSS0_0,CSL_CORE_ID_MAX /* this value indicates the end of the array */
};
#endif#if defined (SOC_AM62X)
uint32_t gRemoteCoreId[] = {CSL_CORE_ID_M4FSS0_0,CSL_CORE_ID_MAX /* this value indicates the end of the array */
};
#endifvoid ipc_recv_task_main(void *args)
{int32_t status;char recvMsg[IPC_RPMESSAGE_MAX_MSG_SIZE+1]; /* +1 for NULL char in worst case */uint16_t recvMsgSize, remoteCoreId, remoteCoreEndPt;RPMessage_Object *pRpmsgObj = (RPMessage_Object *)args;DebugP_log("[IPC RPMSG ECHO] Remote Core waiting for messages at end point %d ... !!!\r\n",RPMessage_getLocalEndPt(pRpmsgObj));/* wait for messages forever in a loop */while(1){/* set 'recvMsgSize' to size of recv buffer,* after return `recvMsgSize` contains actual size of valid data in recv buffer*/recvMsgSize = IPC_RPMESSAGE_MAX_MSG_SIZE;status = RPMessage_recv(pRpmsgObj,recvMsg, &recvMsgSize,&remoteCoreId, &remoteCoreEndPt,SystemP_WAIT_FOREVER);DebugP_assert(status==SystemP_SUCCESS);/* echo the same message string as reply */#if 0 /* not logging this so that this does not add to the latency of message exchange */recvMsg[recvMsgSize] = 0; /* add a NULL char at the end of message */DebugP_log("%s\r\n", recvMsg);#endif/* send ack to sender CPU at the sender end point */status = RPMessage_send(recvMsg, recvMsgSize,remoteCoreId, remoteCoreEndPt,RPMessage_getLocalEndPt(pRpmsgObj),SystemP_WAIT_FOREVER);DebugP_assert(status==SystemP_SUCCESS);}/* This loop will never exit */
}void ipc_rpmsg_send_messages(void)
{RPMessage_CreateParams createParams;uint32_t msg, i, numRemoteCores;uint64_t curTime;char msgBuf[IPC_RPMESSAGE_MAX_MSG_SIZE];int32_t status;uint16_t remoteCoreId, remoteCoreEndPt, msgSize;RPMessage_CreateParams_init(&createParams);createParams.localEndPt = IPC_RPMESSAGE_RNDPT_ACK_REPLY;status = RPMessage_construct(&gIpcAckReplyMsgObject, &createParams);DebugP_assert(status==SystemP_SUCCESS);numRemoteCores = 0;for(i=0; gRemoteCoreId[i]!=CSL_CORE_ID_MAX; i++){if(gRemoteCoreId[i] != IpcNotify_getSelfCoreId()) /* dont count self */{numRemoteCores++;}}DebugP_log("[IPC RPMSG ECHO] Message exchange started with RTOS cores !!!\r\n");curTime = ClockP_getTimeUsec();for(msg=0; msg<gMsgEchoCount; msg++){snprintf(msgBuf, IPC_RPMESSAGE_MAX_MSG_SIZE-1, "%d", msg);msgBuf[IPC_RPMESSAGE_MAX_MSG_SIZE-1] = 0;msgSize = strlen(msgBuf) + 1; /* count the terminating char as well *//* send the same messages to all cores */for(i=0; gRemoteCoreId[i]!=CSL_CORE_ID_MAX; i++ ){if(gRemoteCoreId[i] != IpcNotify_getSelfCoreId()) /* dont send message to self */{status = RPMessage_send(msgBuf, msgSize,gRemoteCoreId[i], IPC_RPMESSAGE_ENDPT_CHRDEV_PING,RPMessage_getLocalEndPt(&gIpcAckReplyMsgObject),SystemP_WAIT_FOREVER);DebugP_assert(status==SystemP_SUCCESS);}}/* wait for response from all cores */for(i=0; gRemoteCoreId[i]!=CSL_CORE_ID_MAX; i++ ){if(gRemoteCoreId[i] != IpcNotify_getSelfCoreId()) /* dont send message to self */{/* set 'msgSize' to size of recv buffer,* after return `msgSize` contains actual size of valid data in recv buffer*/msgSize = sizeof(msgBuf);status = RPMessage_recv(&gIpcAckReplyMsgObject,msgBuf, &msgSize,&remoteCoreId, &remoteCoreEndPt,SystemP_WAIT_FOREVER);DebugP_assert(status==SystemP_SUCCESS);}}}curTime = ClockP_getTimeUsec() - curTime;DebugP_log("[IPC RPMSG ECHO] All echoed messages received by main core from %d remote cores !!!\r\n", numRemoteCores);DebugP_log("[IPC RPMSG ECHO] Messages sent to each core = %d \r\n", gMsgEchoCount);DebugP_log("[IPC RPMSG ECHO] Number of remote cores = %d \r\n", numRemoteCores);DebugP_log("[IPC RPMSG ECHO] Total execution time = %" PRId64 " usecs\r\n", curTime);DebugP_log("[IPC RPMSG ECHO] One way message latency = %" PRId32 " nsec\r\n",(uint32_t)(curTime*1000u/(gMsgEchoCount*numRemoteCores*2)));RPMessage_destruct(&gIpcAckReplyMsgObject);
}void ipc_rpmsg_create_recv_tasks(void)
{int32_t status;RPMessage_CreateParams createParams;TaskP_Params taskParams;RPMessage_CreateParams_init(&createParams);createParams.localEndPt = IPC_RPMESSAGE_ENDPT_PING;status = RPMessage_construct(&gIpcRecvMsgObject[0], &createParams);DebugP_assert(status==SystemP_SUCCESS);RPMessage_CreateParams_init(&createParams);createParams.localEndPt = IPC_RPMESSAGE_ENDPT_CHRDEV_PING;status = RPMessage_construct(&gIpcRecvMsgObject[1], &createParams);DebugP_assert(status==SystemP_SUCCESS);/* We need to "announce" to Linux client else Linux does not know a service exists on this CPU* This is not mandatory to do for RTOS clients*/status = RPMessage_announce(CSL_CORE_ID_A53SS0_0, IPC_RPMESSAGE_ENDPT_PING, IPC_RPMESSAGE_SERVICE_PING);DebugP_assert(status==SystemP_SUCCESS);status = RPMessage_announce(CSL_CORE_ID_A53SS0_0, IPC_RPMESSAGE_ENDPT_CHRDEV_PING, IPC_RPMESSAGE_SERVICE_CHRDEV);DebugP_assert(status==SystemP_SUCCESS);/* Create the tasks which will handle the ping service */TaskP_Params_init(&taskParams);taskParams.name = "RPMESSAGE_PING";taskParams.stackSize = IPC_RPMESSAFE_TASK_STACK_SIZE;taskParams.stack = gIpcTaskStack[0];taskParams.priority = IPC_RPMESSAFE_TASK_PRI;/* we use the same task function for echo but pass the appropiate rpmsg handle to it, to echo messages */taskParams.args = &gIpcRecvMsgObject[0];taskParams.taskMain = ipc_recv_task_main;status = TaskP_construct(&gIpcTask[0], &taskParams);DebugP_assert(status == SystemP_SUCCESS);TaskP_Params_init(&taskParams);taskParams.name = "RPMESSAGE_CHAR_PING";taskParams.stackSize = IPC_RPMESSAFE_TASK_STACK_SIZE;taskParams.stack = gIpcTaskStack[1];taskParams.priority = IPC_RPMESSAFE_TASK_PRI;/* we use the same task function for echo but pass the appropiate rpmsg handle to it, to echo messages */taskParams.args = &gIpcRecvMsgObject[1];taskParams.taskMain = ipc_recv_task_main;status = TaskP_construct(&gIpcTask[1], &taskParams);DebugP_assert(status == SystemP_SUCCESS);
}void ipc_rpmsg_echo_main(void *args)
{int32_t status;Drivers_open();Board_driversOpen();DebugP_log("[IPC RPMSG ECHO] %s %s\r\n", __DATE__, __TIME__);/* This API MUST be called by applications when its ready to talk to Linux */status = RPMessage_waitForLinuxReady(SystemP_WAIT_FOREVER);DebugP_assert(status==SystemP_SUCCESS);/* create message receive tasks, these tasks always run and never exit */ipc_rpmsg_create_recv_tasks();/* wait for all non-Linux cores to be ready, this ensure that when we send messages below* they wont be lost due to rpmsg end point not created at remote core*/IpcNotify_syncAll(SystemP_WAIT_FOREVER);/* Due to below "if" condition only one non-Linux core sends messages to all other non-Linux Cores* This is done mainly to show deterministic latency measurement*/if( IpcNotify_getSelfCoreId() == CSL_CORE_ID_R5FSS0_0 ){ipc_rpmsg_send_messages();}/* exit from this task, vTaskDelete() is called outside this function, so simply return */Board_driversClose();/* We dont close drivers since threads are running in background *//* Drivers_close(); */
}相关文章:
How to use CCS to debug a running M4F core that was started by Linux?
参考FAQ:AM62x & AM64x: How to use CCS to debug a running M4F core that was started by Linux? 问题记录: 1.使用SD卡启动模式,板上运行Linux。 当Linux系统启动后,9表示M4F core: am64xx-evm login: root rootam64xx…...
216、组合总数III
难度:中等 找出所有相加之和为 n 的 k 个数的组合,且满足下列条件: 只使用数字1到9 每个数字 最多使用一次 返回 所有可能的有效组合的列表 。该列表不能包含相同的组合两次,组合可以以任何顺序返回。 示例 1: 输入: k 3, n 7…...
简单的重装系统教程
郁闷,最近电脑一直蓝屏重启,用 2 分钟就蓝屏一次,遂产生重装系统的想法。 准备 U盘(8G或以上) PE 工具: 微PE工具箱快速指引 | 微PE优盘使用说明书 (wepe.com.cn) 系统镜像: 官网 Windows 10 官网 Windows 11 M…...
机器学习---集成学习报告
1.原理以及举例 1.1原理 集成学习(Ensemble Learning)是一种机器学习策略,它通过结合多个基学习器(base learners)的预测来提高模型的性能。集成学习的目标是创建一个比单个基学习器更准确、更稳定的最终预测模型。这…...
教你如何将PDF文件转换成PPT演示文稿
在工作和学习中,我们可能需要将一些PDF文件转换成PPT演示文稿,以便于更好地展示和分享。虽然PPT和PDF是两种不同的文档格式,但是我们可以使用一些专业的软件或在线工具来实现这种转换。下面就让我们来教你如何将PDF文件转换成PPT演示文稿。 …...
涨点技巧: 谷歌强势推出优化器Lion,引入到Yolov5/Yolov7,内存更小、效率更高,秒杀Adam(W)
1.Lion优化器介绍 论文:https://arxiv.org/abs/2302.06675 代码:automl/lion at master google/automl GitHub 1.1 简单、内存高效、运行速度更快 1)与 AdamW 和各种自适应优化器需要同时保存一阶和二阶矩相比,Lion 只需要动量,将额外的内存占用减半; 2)由于 Lion…...
Windows GPU版本的深度学习环境安装
本文记录了cuda、cuDNN的安装配置。 参考文章: cuda-installation-guide-microsoft-windows 12.1 documentation Installation Guide :: NVIDIA cuDNN Documentation 一、cuda安装 注意事项: 1、cuda安装最重要的是查看自己应该安装的版本。 表格…...
C语言实践——通讯录(3)(文件版)
首先感谢上一篇博客的大佬们的点赞,非常感谢!!! 目录 前言 一、需要添加的功能 1.增加保存数据函数——可以保存数据到文件中 主要逻辑: 注意事项: 代码实现: 2.修改初始化函数——新…...
GPT撑腰,微软再战谷歌 | 大厂集体抢滩ChatGPT:谁真的有实力,谁在试点商业化?
国内互联网大厂已经很久没有这样的盛况了! 在各自领域成长为头部的互联网大厂们,近年来正在向“自留地”的纵深发展,正面交锋的机会并不多。直到大洋彼岸传来GPT的声音后,一下子抓住了大厂们的G点,他们仿佛听到了新一轮…...
【消息队列】细说Kafka消费者的分区分配和重平衡
消费方式 我们直到在性能设计中异步模式,一般要么是采用pull,要么采用push。而两种方式各有优缺点。 pull :说白了就是通过消费端进行主动拉去数据,会根据自身系统处理能力去获取消息,上有Broker系统无需关注消费端的…...
【Python从入门到人工智能】14个必会的Python内置函数(7)——打印输出(详细语法参考 + 参数说明 + 具体示例)| 附:Python输出表情包
你仔细想想,你和谁在一起的时候,最放得开、最自然、最舒服,又毫无顾忌,可以做回真实的你。那个人才是你心里最特别,最重要的人。 🎯作者主页: 追光者♂🔥 🌸个人简介: 💖[1] 计算机专业硕士研究生💖 🌟[2] 2022年度博客之星人工智能领域TOP4�…...
为什么要创建FAQ?这篇文章告诉你
什么是FAQ 通过上述的引入大家应该也了解到了,FAQ是为了“解决问题”而存在的。FAQ是英文Frequently Asked Questions的缩写,中文意思就是“经常问到的问题”,或者更通俗地叫做“常见问题解答”。FAQ是当前网络上提供在线帮助的主要手段&…...
基于html+css的盒子展示1
准备项目 项目开发工具 Visual Studio Code 1.44.2 版本: 1.44.2 提交: ff915844119ce9485abfe8aa9076ec76b5300ddd 日期: 2020-04-16T16:36:23.138Z Electron: 7.1.11 Chrome: 78.0.3904.130 Node.js: 12.8.1 V8: 7.8.279.23-electron.0 OS: Windows_NT x64 10.0.19044 项目…...
Python 无监督学习实用指南:1~5
原文:Hands-on unsupervised learning with Python 协议:CC BY-NC-SA 4.0 译者:飞龙 本文来自【ApacheCN 深度学习 译文集】,采用译后编辑(MTPE)流程来尽可能提升效率。 不要担心自己的形象,只关…...
2023 腾讯暑期实习申请经验分享
首先要向还在等我出 CMU 15-445 后面实验的同学们说声抱歉,这个系列可能暂时要停更啦。 一方面是博主最近课程和实验室方面的任务比较多,另一方面是有幸拿下了今年腾讯 WXG 后端开发的暑期实习 Offer,后面可能要提前学习一些工作中用到的框架…...
Protocol Buffers 介绍
Protocol Buffers Protocol Buffers ,协议缓冲区。什么是Protocol Buffers呢?或者我们简称PB 吧。那么Protocol Buffers 是一种与语言无关、与平台无关的可扩展机制,用于序列化结构化的数据。 example message Person {optional string nam…...
【模电实验】基尔霍夫定律、叠加定理和戴维南定理验证实验
实验目的 验证基尔霍夫电流定律(KCL)和电压定律(KVL)加深对该定理的理解验证叠加定理,加深对该定理的理解验证戴维南定理,掌握有源二端口网络的开路电压,短路电流和入端等效电阻的测定方法通过实…...
java某百货店POS积分管理系统_积分点更新生成以及通票回收处理
百货店是生活中不可缺少的一部分,为了给顾客提供更方便的服务平台以及更好的服务质量,而设计了POS积分管理系统。百货店通过点积分的管理获得顾客更好的信誉,增加客户流量,获得更多的利益。在百货店经营的过程中,每天的…...
Flutter 常用指令
1.flutter create app_01 :创建一个新的Flutter项目 2.flutter run:运行应用程序 3.flutter run -d <deviceId>:运行指定模拟器或者真机 4.flutter devices:查看计算机上的真机设备和IOS模拟器 5.flutter emulators&…...
定义全局变量property与getprop
authordaisy.skye的博客_CSDN博客-Qt,嵌入式,Linux领域博主 adb调试 adb shell getprop .adb logcat 报错 init: sys_prop: permission denied uid:1006 name:ro.camera.gc02m1 在linux驱动中查找 find ./ -name *.c | xargs grep -n "property_set" find ./ -n…...
day52 ResNet18 CBAM
在深度学习的旅程中,我们不断探索如何提升模型的性能。今天,我将分享我在 ResNet18 模型中插入 CBAM(Convolutional Block Attention Module)模块,并采用分阶段微调策略的实践过程。通过这个过程,我不仅提升…...
安宝特方案丨XRSOP人员作业标准化管理平台:AR智慧点检验收套件
在选煤厂、化工厂、钢铁厂等过程生产型企业,其生产设备的运行效率和非计划停机对工业制造效益有较大影响。 随着企业自动化和智能化建设的推进,需提前预防假检、错检、漏检,推动智慧生产运维系统数据的流动和现场赋能应用。同时,…...
MMaDA: Multimodal Large Diffusion Language Models
CODE : https://github.com/Gen-Verse/MMaDA Abstract 我们介绍了一种新型的多模态扩散基础模型MMaDA,它被设计用于在文本推理、多模态理解和文本到图像生成等不同领域实现卓越的性能。该方法的特点是三个关键创新:(i) MMaDA采用统一的扩散架构…...
江苏艾立泰跨国资源接力:废料变黄金的绿色供应链革命
在华东塑料包装行业面临限塑令深度调整的背景下,江苏艾立泰以一场跨国资源接力的创新实践,重新定义了绿色供应链的边界。 跨国回收网络:废料变黄金的全球棋局 艾立泰在欧洲、东南亚建立再生塑料回收点,将海外废弃包装箱通过标准…...
vue3 定时器-定义全局方法 vue+ts
1.创建ts文件 路径:src/utils/timer.ts 完整代码: import { onUnmounted } from vuetype TimerCallback (...args: any[]) > voidexport function useGlobalTimer() {const timers: Map<number, NodeJS.Timeout> new Map()// 创建定时器con…...
【配置 YOLOX 用于按目录分类的图片数据集】
现在的图标点选越来越多,如何一步解决,采用 YOLOX 目标检测模式则可以轻松解决 要在 YOLOX 中使用按目录分类的图片数据集(每个目录代表一个类别,目录下是该类别的所有图片),你需要进行以下配置步骤&#x…...
什么是Ansible Jinja2
理解 Ansible Jinja2 模板 Ansible 是一款功能强大的开源自动化工具,可让您无缝地管理和配置系统。Ansible 的一大亮点是它使用 Jinja2 模板,允许您根据变量数据动态生成文件、配置设置和脚本。本文将向您介绍 Ansible 中的 Jinja2 模板,并通…...
初学 pytest 记录
安装 pip install pytest用例可以是函数也可以是类中的方法 def test_func():print()class TestAdd: # def __init__(self): 在 pytest 中不可以使用__init__方法 # self.cc 12345 pytest.mark.api def test_str(self):res add(1, 2)assert res 12def test_int(self):r…...
DingDing机器人群消息推送
文章目录 1 新建机器人2 API文档说明3 代码编写 1 新建机器人 点击群设置 下滑到群管理的机器人,点击进入 添加机器人 选择自定义Webhook服务 点击添加 设置安全设置,详见说明文档 成功后,记录Webhook 2 API文档说明 点击设置说明 查看自…...
省略号和可变参数模板
本文主要介绍如何展开可变参数的参数包 1.C语言的va_list展开可变参数 #include <iostream> #include <cstdarg>void printNumbers(int count, ...) {// 声明va_list类型的变量va_list args;// 使用va_start将可变参数写入变量argsva_start(args, count);for (in…...
