当前位置: 首页 > news >正文

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!

在这里插入图片描述

正确做法:

  1. 在CCS中构建remote core project(ipc_rpmsg_echo_linux_am64x-evm_m4fss0-0_freertos_ti-arm-clang)

  2. 将生成的.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
  3. 重启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
  4. 启动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? 问题记录&#xff1a; 1.使用SD卡启动模式&#xff0c;板上运行Linux。 当Linux系统启动后&#xff0c;9表示M4F core&#xff1a; am64xx-evm login: root rootam64xx…...

216、组合总数III

难度&#xff1a;中等 找出所有相加之和为 n 的 k 个数的组合&#xff0c;且满足下列条件&#xff1a; 只使用数字1到9 每个数字 最多使用一次 返回 所有可能的有效组合的列表 。该列表不能包含相同的组合两次&#xff0c;组合可以以任何顺序返回。 示例 1: 输入: k 3, n 7…...

简单的重装系统教程

郁闷&#xff0c;最近电脑一直蓝屏重启&#xff0c;用 2 分钟就蓝屏一次&#xff0c;遂产生重装系统的想法。 准备 U盘(8G或以上) PE 工具&#xff1a; 微PE工具箱快速指引 | 微PE优盘使用说明书 (wepe.com.cn) 系统镜像&#xff1a; 官网 Windows 10 官网 Windows 11 M…...

机器学习---集成学习报告

1.原理以及举例 1.1原理 集成学习&#xff08;Ensemble Learning&#xff09;是一种机器学习策略&#xff0c;它通过结合多个基学习器&#xff08;base learners&#xff09;的预测来提高模型的性能。集成学习的目标是创建一个比单个基学习器更准确、更稳定的最终预测模型。这…...

教你如何将PDF文件转换成PPT演示文稿

在工作和学习中&#xff0c;我们可能需要将一些PDF文件转换成PPT演示文稿&#xff0c;以便于更好地展示和分享。虽然PPT和PDF是两种不同的文档格式&#xff0c;但是我们可以使用一些专业的软件或在线工具来实现这种转换。下面就让我们来教你如何将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的安装配置。 参考文章&#xff1a; cuda-installation-guide-microsoft-windows 12.1 documentation Installation Guide :: NVIDIA cuDNN Documentation 一、cuda安装 注意事项&#xff1a; 1、cuda安装最重要的是查看自己应该安装的版本。 表格…...

C语言实践——通讯录(3)(文件版)

首先感谢上一篇博客的大佬们的点赞&#xff0c;非常感谢&#xff01;&#xff01;&#xff01; 目录 前言 一、需要添加的功能 1.增加保存数据函数——可以保存数据到文件中 主要逻辑&#xff1a; 注意事项&#xff1a; 代码实现&#xff1a; 2.修改初始化函数——新…...

GPT撑腰,微软再战谷歌 | 大厂集体抢滩ChatGPT:谁真的有实力,谁在试点商业化?

国内互联网大厂已经很久没有这样的盛况了&#xff01; 在各自领域成长为头部的互联网大厂们&#xff0c;近年来正在向“自留地”的纵深发展&#xff0c;正面交锋的机会并不多。直到大洋彼岸传来GPT的声音后&#xff0c;一下子抓住了大厂们的G点&#xff0c;他们仿佛听到了新一轮…...

【消息队列】细说Kafka消费者的分区分配和重平衡

消费方式 我们直到在性能设计中异步模式&#xff0c;一般要么是采用pull&#xff0c;要么采用push。而两种方式各有优缺点。 pull &#xff1a;说白了就是通过消费端进行主动拉去数据&#xff0c;会根据自身系统处理能力去获取消息&#xff0c;上有Broker系统无需关注消费端的…...

【Python从入门到人工智能】14个必会的Python内置函数(7)——打印输出(详细语法参考 + 参数说明 + 具体示例)| 附:Python输出表情包

你仔细想想,你和谁在一起的时候,最放得开、最自然、最舒服,又毫无顾忌,可以做回真实的你。那个人才是你心里最特别,最重要的人。 🎯作者主页: 追光者♂🔥 🌸个人简介: 💖[1] 计算机专业硕士研究生💖 🌟[2] 2022年度博客之星人工智能领域TOP4�…...

为什么要创建FAQ?这篇文章告诉你

什么是FAQ 通过上述的引入大家应该也了解到了&#xff0c;FAQ是为了“解决问题”而存在的。FAQ是英文Frequently Asked Questions的缩写&#xff0c;中文意思就是“经常问到的问题”&#xff0c;或者更通俗地叫做“常见问题解答”。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

原文&#xff1a;Hands-on unsupervised learning with Python 协议&#xff1a;CC BY-NC-SA 4.0 译者&#xff1a;飞龙 本文来自【ApacheCN 深度学习 译文集】&#xff0c;采用译后编辑&#xff08;MTPE&#xff09;流程来尽可能提升效率。 不要担心自己的形象&#xff0c;只关…...

2023 腾讯暑期实习申请经验分享

首先要向还在等我出 CMU 15-445 后面实验的同学们说声抱歉&#xff0c;这个系列可能暂时要停更啦。 一方面是博主最近课程和实验室方面的任务比较多&#xff0c;另一方面是有幸拿下了今年腾讯 WXG 后端开发的暑期实习 Offer&#xff0c;后面可能要提前学习一些工作中用到的框架…...

Protocol Buffers 介绍

Protocol Buffers Protocol Buffers &#xff0c;协议缓冲区。什么是Protocol Buffers呢&#xff1f;或者我们简称PB 吧。那么Protocol Buffers 是一种与语言无关、与平台无关的可扩展机制&#xff0c;用于序列化结构化的数据。 example message Person {optional string nam…...

【模电实验】基尔霍夫定律、叠加定理和戴维南定理验证实验

实验目的 验证基尔霍夫电流定律&#xff08;KCL&#xff09;和电压定律&#xff08;KVL&#xff09;加深对该定理的理解验证叠加定理&#xff0c;加深对该定理的理解验证戴维南定理&#xff0c;掌握有源二端口网络的开路电压&#xff0c;短路电流和入端等效电阻的测定方法通过实…...

java某百货店POS积分管理系统_积分点更新生成以及通票回收处理

百货店是生活中不可缺少的一部分&#xff0c;为了给顾客提供更方便的服务平台以及更好的服务质量&#xff0c;而设计了POS积分管理系统。百货店通过点积分的管理获得顾客更好的信誉&#xff0c;增加客户流量&#xff0c;获得更多的利益。在百货店经营的过程中&#xff0c;每天的…...

Flutter 常用指令

1.flutter create app_01 &#xff1a;创建一个新的Flutter项目 2.flutter run&#xff1a;运行应用程序 3.flutter run -d <deviceId>&#xff1a;运行指定模拟器或者真机 4.flutter devices&#xff1a;查看计算机上的真机设备和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…...

接口测试中缓存处理策略

在接口测试中&#xff0c;缓存处理策略是一个关键环节&#xff0c;直接影响测试结果的准确性和可靠性。合理的缓存处理策略能够确保测试环境的一致性&#xff0c;避免因缓存数据导致的测试偏差。以下是接口测试中常见的缓存处理策略及其详细说明&#xff1a; 一、缓存处理的核…...

深入剖析AI大模型:大模型时代的 Prompt 工程全解析

今天聊的内容&#xff0c;我认为是AI开发里面非常重要的内容。它在AI开发里无处不在&#xff0c;当你对 AI 助手说 "用李白的风格写一首关于人工智能的诗"&#xff0c;或者让翻译模型 "将这段合同翻译成商务日语" 时&#xff0c;输入的这句话就是 Prompt。…...

(十)学生端搭建

本次旨在将之前的已完成的部分功能进行拼装到学生端&#xff0c;同时完善学生端的构建。本次工作主要包括&#xff1a; 1.学生端整体界面布局 2.模拟考场与部分个人画像流程的串联 3.整体学生端逻辑 一、学生端 在主界面可以选择自己的用户角色 选择学生则进入学生登录界面…...

逻辑回归:给不确定性划界的分类大师

想象你是一名医生。面对患者的检查报告&#xff08;肿瘤大小、血液指标&#xff09;&#xff0c;你需要做出一个**决定性判断**&#xff1a;恶性还是良性&#xff1f;这种“非黑即白”的抉择&#xff0c;正是**逻辑回归&#xff08;Logistic Regression&#xff09;** 的战场&a…...

python/java环境配置

环境变量放一起 python&#xff1a; 1.首先下载Python Python下载地址&#xff1a;Download Python | Python.org downloads ---windows -- 64 2.安装Python 下面两个&#xff0c;然后自定义&#xff0c;全选 可以把前4个选上 3.环境配置 1&#xff09;搜高级系统设置 2…...

解锁数据库简洁之道:FastAPI与SQLModel实战指南

在构建现代Web应用程序时&#xff0c;与数据库的交互无疑是核心环节。虽然传统的数据库操作方式&#xff08;如直接编写SQL语句与psycopg2交互&#xff09;赋予了我们精细的控制权&#xff0c;但在面对日益复杂的业务逻辑和快速迭代的需求时&#xff0c;这种方式的开发效率和可…...

高等数学(下)题型笔记(八)空间解析几何与向量代数

目录 0 前言 1 向量的点乘 1.1 基本公式 1.2 例题 2 向量的叉乘 2.1 基础知识 2.2 例题 3 空间平面方程 3.1 基础知识 3.2 例题 4 空间直线方程 4.1 基础知识 4.2 例题 5 旋转曲面及其方程 5.1 基础知识 5.2 例题 6 空间曲面的法线与切平面 6.1 基础知识 6.2…...

JavaScript基础-API 和 Web API

在学习JavaScript的过程中&#xff0c;理解API&#xff08;应用程序接口&#xff09;和Web API的概念及其应用是非常重要的。这些工具极大地扩展了JavaScript的功能&#xff0c;使得开发者能够创建出功能丰富、交互性强的Web应用程序。本文将深入探讨JavaScript中的API与Web AP…...

【无标题】路径问题的革命性重构:基于二维拓扑收缩色动力学模型的零点隧穿理论

路径问题的革命性重构&#xff1a;基于二维拓扑收缩色动力学模型的零点隧穿理论 一、传统路径模型的根本缺陷 在经典正方形路径问题中&#xff08;图1&#xff09;&#xff1a; mermaid graph LR A((A)) --- B((B)) B --- C((C)) C --- D((D)) D --- A A -.- C[无直接路径] B -…...

在 Spring Boot 项目里,MYSQL中json类型字段使用

前言&#xff1a; 因为程序特殊需求导致&#xff0c;需要mysql数据库存储json类型数据&#xff0c;因此记录一下使用流程 1.java实体中新增字段 private List<User> users 2.增加mybatis-plus注解 TableField(typeHandler FastjsonTypeHandler.class) private Lis…...