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…...

双目三维测距(python)
文章目录 1. 双目检测1.1 调用相机1.2 分割画面 2. 双目标定2.1 相机标定2.2 获取参数 3. 双目测距3.1 立体校正3.1.1 校正目的3.1.2 校正方法3.1.2 相关代码 3.2 立体匹配和视差计算3.3 深度计算3.4 注意事项 4. 完整代码 代码打包下载: 链接1:https://…...

数据结构|二叉树的三种遍历方式,你掌握了几种?
目录 1、遍历方式 2、前序遍历 3、中序遍历 1、遍历方式 学习二叉树的结构,最简单的方式就是遍历二叉树。遍历二叉树就是通过某条线路对二叉树的各个结点进行一次访问,访问的方法有三种分为前序遍历、中序遍历、后续遍历,层序遍历它们的遍…...

Direct3D 12——灯光——法向量
a:平面法线着色 b:顶点法线着色 c:像素着色 平面法线(face normal,由于在计算机几何学中法线是有方向的向量,所以也有将normal译作法向量) 是 一种描述多边形朝向(即正交于多边形上所有点)的单位向量。 曲面法线&a…...

软考-信息系统工程(五)
信息系统工程 Garlan和Shaw对通用软件架构风格进行了分类,他们将软件架构分为:(曾经考过1分选择题 区分) 数据流风格:数据流风格包括批处理序列和管道/过滤器两种风格。调用/返回风格:调用/返回风格包括主程序/子程序、数据抽象和面向对象,以及层次结构…...

解决谷歌翻译不能使用的问题
今天登录国外网站,发现谷歌翻译已无法正常使用,网上最多的方法就是更改host文件,在host内增加ip地址,但是经常失效,经常手动更改增加ip着实烦恼,还有可能有别的错误。 最终解决方式是:登录GitH…...

Insomnia 简单使用方法
文章目录 1. 新建工程2. 新建若干文件夹3. 设置环境变量4. 授权以及进行请求的链式调用 (chaining requests)4. 1 解决办法 14. 2 解决办法 2 Insomnia 同 Postman, 用于测试后端 endpoint,很容易使用。 使用步骤如下: 1. 新建工程 2. 新建若…...

2023接口自动化测试,完整入门篇
1. 什么是接口测试 顾名思义,接口测试是对系统或组件之间的接口进行测试,主要是校验数据的交换,传递和控制管理过程,以及相互逻辑依赖关系。其中接口协议分为HTTP,WebService,Dubbo,Thrift,Socket等类型,测试类型又主…...

2023年股票代持行业研究报告
第一章 股票代持概述 1.1 基本概念 股票代持,或称委托持股,是指实际出资人与名义出资人达成以下约定:名义出资人作为名义股东,在股东名册等公司工商登记信息上出现,而实际上由实际出资人出资并享有投资权益。 股票代…...

《Netty》从零开始学netty源码(三十九)之PoolSubPage的内存分配
目录 PoolSubPage.allocategetNextAvail方法toHandle方法removeFromPool方法 PoolSubPage.allocate 上一篇我们介绍了PoolSubPage的简单知识,当我们需要PoolSubPage的内存时可调用allocate方法查找可分配二进制的位置,具体的源码过程如下: …...

【目标检测论文阅读笔记】Reducing Label Noise in Anchor-Free Object Detection
(Augmentation for small object detection) Abstract 当前的 anchor-free无锚目标检测器 将空间上落在真值框预定义中心区域内的所有特征标记为正。这种方法会在训练过程中产生 标签噪声,因为这些 正标记的特征中的一些 可能位于背景或遮挡…...