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…...
uniapp微信小程序视频实时流+pc端预览方案
方案类型技术实现是否免费优点缺点适用场景延迟范围开发复杂度WebSocket图片帧定时拍照Base64传输✅ 完全免费无需服务器 纯前端实现高延迟高流量 帧率极低个人demo测试 超低频监控500ms-2s⭐⭐RTMP推流TRTC/即构SDK推流❌ 付费方案 (部分有免费额度&#x…...
鱼香ros docker配置镜像报错:https://registry-1.docker.io/v2/
使用鱼香ros一件安装docker时的https://registry-1.docker.io/v2/问题 一键安装指令 wget http://fishros.com/install -O fishros && . fishros出现问题:docker pull 失败 网络不同,需要使用镜像源 按照如下步骤操作 sudo vi /etc/docker/dae…...
MySQL中【正则表达式】用法
MySQL 中正则表达式通过 REGEXP 或 RLIKE 操作符实现(两者等价),用于在 WHERE 子句中进行复杂的字符串模式匹配。以下是核心用法和示例: 一、基础语法 SELECT column_name FROM table_name WHERE column_name REGEXP pattern; …...
【JavaSE】绘图与事件入门学习笔记
-Java绘图坐标体系 坐标体系-介绍 坐标原点位于左上角,以像素为单位。 在Java坐标系中,第一个是x坐标,表示当前位置为水平方向,距离坐标原点x个像素;第二个是y坐标,表示当前位置为垂直方向,距离坐标原点y个像素。 坐标体系-像素 …...
Device Mapper 机制
Device Mapper 机制详解 Device Mapper(简称 DM)是 Linux 内核中的一套通用块设备映射框架,为 LVM、加密磁盘、RAID 等提供底层支持。本文将详细介绍 Device Mapper 的原理、实现、内核配置、常用工具、操作测试流程,并配以详细的…...
python报错No module named ‘tensorflow.keras‘
是由于不同版本的tensorflow下的keras所在的路径不同,结合所安装的tensorflow的目录结构修改from语句即可。 原语句: from tensorflow.keras.layers import Conv1D, MaxPooling1D, LSTM, Dense 修改后: from tensorflow.python.keras.lay…...
Linux nano命令的基本使用
参考资料 GNU nanoを使いこなすnano基础 目录 一. 简介二. 文件打开2.1 普通方式打开文件2.2 只读方式打开文件 三. 文件查看3.1 打开文件时,显示行号3.2 翻页查看 四. 文件编辑4.1 Ctrl K 复制 和 Ctrl U 粘贴4.2 Alt/Esc U 撤回 五. 文件保存与退出5.1 Ctrl …...
Linux系统部署KES
1、安装准备 1.版本说明V008R006C009B0014 V008:是version产品的大版本。 R006:是release产品特性版本。 C009:是通用版 B0014:是build开发过程中的构建版本2.硬件要求 #安全版和企业版 内存:1GB 以上 硬盘…...
6个月Python学习计划 Day 16 - 面向对象编程(OOP)基础
第三周 Day 3 🎯 今日目标 理解类(class)和对象(object)的关系学会定义类的属性、方法和构造函数(init)掌握对象的创建与使用初识封装、继承和多态的基本概念(预告) &a…...
32单片机——基本定时器
STM32F103有众多的定时器,其中包括2个基本定时器(TIM6和TIM7)、4个通用定时器(TIM2~TIM5)、2个高级控制定时器(TIM1和TIM8),这些定时器彼此完全独立,不共享任何资源 1、定…...
