基于mmWave SDK创建一个IWR6843工程模板(MSS侧)

2024-03-08 10:59

本文主要是介绍基于mmWave SDK创建一个IWR6843工程模板(MSS侧),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

基于mmWave SDK创建一个IWR6843工程模板(MSS侧)

这两天拿到了一套Ti毫米波雷达的评估套件(IWR6843ISK-ODS + MMWAVEICBOOST),于是便开始了漫长的学习,写下此篇以记录学习过程。

Ti官方实际上也有提供基于SYSBIOS从头开始创建工程的教程,但较为简略且没有具体演示。按照我开发单片机的惯例,既然这集成SoC内部也是MCU+DSP,那么肯定要先点个灯呀!

结果不看不要紧,一看发现SDK里的驱动设计很不友好。它没有工程,无法直接导入CCS调试,只能通过SDK用户手册的4.5节内容对例程进行编译并下载编译后文件。而能供CCS直接导入使用的工程仅在mmWave Industrial Toolbox中提供,但这些工程都十分复杂(打开个main文件一看都有数千行),非常不利于入门。

遂决定自己动手,对比了官方在mmWave Industrial Toolbox中提供的一系列高级例程,搭建一个可以用于驱动测试和功能开发的模板。

一、搭建前的准备

确保以下各项均已被安装:

  1. mmWave SDK
  2. CCS
  3. mmWave Radar Device support

上述这些软件/库如果没安装好的话,推荐先安装好,否则可能会因为某个库/支持包未安装导致工程无法导入、导入后无法编译等问题。

二、在CCS中新建工程(以CCSV10为例)

1. 创建一个CCS工程

打开CCS,在上方菜单栏中选择 Project->New CCS Project…,弹出以下界面

新建工程界面

目标器件选择IWR6843,由于我的雷达模块是搭配MMWAVEICBOOST载板使用的,所以我的连接器选择了XDS110。工程名可自定,工程模板选择 SYS/BIOS->Ti Target Examples->Typical,之后Next

Next之后要求选择Target和Platform,在页面下方处如下填写:
Target: ti.targets.arm.elf.R4Ft
Platform: ti.platforms.cortexR:IWR68XX:false:200

Build-profile我选的debug,release应该也是可行的

这样工程就创建好了。在左侧的Project Explorer中,应该能看到名为“Template_IWR68xx”的工程。接下来,我们需要对工程的属性进行调整,并覆盖一些工程自带的文件来满足开发需求。

在这里插入图片描述

首先修改main.c,打开工程内的main.c并修改为如下内容:

#include <stdint.h>
#include <stdlib.h>
#include <stddef.h>
#include <string.h>
#include <stdio.h>
#include <math.h>/* BIOS/XDC Include Files. */
/* SYS/BIOS所使用的头文件 */
#include <xdc/std.h>
#include <xdc/cfg/global.h>
#include <xdc/runtime/IHeap.h>
#include <xdc/runtime/System.h>
#include <xdc/runtime/Error.h>
#include <xdc/runtime/Memory.h>
#include <ti/sysbios/BIOS.h>
#include <ti/sysbios/knl/Task.h>
#include <ti/sysbios/knl/Event.h>
#include <ti/sysbios/knl/Semaphore.h>
#include <ti/sysbios/knl/Clock.h>
#include <ti/sysbios/heaps/HeapBuf.h>
#include <ti/sysbios/heaps/HeapMem.h>
#include <ti/sysbios/knl/Event.h>
#include <ti/sysbios/family/arm/v7a/Pmu.h>
#include <ti/sysbios/family/arm/v7r/vim/Hwi.h>
#include <ti/sysbios/utils/Load.h>/* mmWave SDK Include Files: */
/* SDK头文件 */
#include <ti/common/sys_common.h>
#include <ti/common/mmwave_sdk_version.h>
#include <ti/drivers/soc/soc.h>
#include <ti/drivers/esm/esm.h>
#include <ti/drivers/crc/crc.h>
#include <ti/drivers/gpio/gpio.h>
#include <ti/drivers/mailbox/mailbox.h>
#include <ti/drivers/pinmux/pinmux.h>
#include <ti/control/mmwave/mmwave.h>
#include <ti/control/dpm/dpm.h>
#include <ti/drivers/osal/DebugP.h>
#include <ti/drivers/uart/UART.h>
#include <ti/utils/cli/cli.h>
#include <ti/utils/mathutils/mathutils.h>
#include <ti/utils/testlogger/logger.h>MCPI_LOGBUF_INIT(9216);void MM_initTask(UArg arg0, UArg arg1)
{while(1){System_printf("Hello world!\n");        //在控制台输出Hello world!Task_sleep(1000);                       //任务调度,挂起1s}
}int main (void)
{int32_t         errCode;    //存放SOC初始化错误代码SOC_Handle      socHandle;  //SOC句柄SOC_Cfg         socCfg;     //SOC配置结构体Task_Params     taskParams; //任务参数ESM_init(0U);               //与安全等有关,可略过/* Initialize the SOC confiugration: *//* 初始化SOC配置结构体 */memset ((void *)&socCfg, 0, sizeof(SOC_Cfg));/* 配置SOC配置结构体 *//* Populate the SOC configuration: */socCfg.clockCfg = SOC_SysClock_INIT;socCfg.mpuCfg = SOC_MPUCfg_CONFIG;/* require to unhalt the DSS if this core is available in selected device */socCfg.dssCfg = SOC_DSSCfg_UNHALT;/* Initialize the SOC Module: This is done as soon as the application is started* to ensure that the MPU is correctly configured. *//* SOC初始化,必须在系统运行后尽快调用该初始化函数 */socHandle = SOC_init (&socCfg, &errCode);/* Initialize the Task Parameters. *//* 创建一个任务用于测试 */Task_Params_init(&taskParams);taskParams.stackSize = 4*1024;      //任务堆栈大小4KBTask_create(MM_initTask, &taskParams, NULL);/* Start BIOS */BIOS_start();return 0;
}

这段代码的main函数部分源自官方参考回答,用于整块SoC的初始化。之后我添加了一个MM_initTask线程,该线程每隔1s会在控制台中打印一次输出以表示程序正常运行。

先别急!此时如果编译的话,会出现很多错误,例如找不到头文件和库文件等。所以,接下来还需要对工程进行一些修改。

2. 拷贝cmd文件

对于Ti的产品,大部分都是通过.cmd文件来确定内存划分情况的。虽然也可以在构建SYS/BIOS时动态生成,但总归不太好用。

因此,我们从 <SDK安装路径>/Packages/ti/platform/xwr68xx 下,拷贝r4f_linker.cmd到工程中,该cmd文件是Ti提供的用于不同平台的通用cmd文件,添加完成后工程如下

在这里插入图片描述

打开r4f_linker.cmd,会发现有几个未定义的宏。不过不用担心找不到,之后在工程属性配置里会对这些宏进行预定义以保证编译能通过。

3. 替换.cfg文件

.cfg文件是用于构建SYS/BIOS的配置文件。通常来说,SYS/BIOS的工程都是根据.cfg文件,在构建工程时动态地“组装”出整个系统。这里,我们也使用官方在sdk中提供的.cfg文件对工程自带的.cfg文件进行替换。

打开**<SDK安装路径>/Packages/ti/drivers**下的任意一个驱动文件夹,这里以gpio驱动为例,则打开<SDK安装路径>/Packages/ti/drivers/gpio/test/xwr68xx,从中拷贝mss.cfg到工程中,此时工程如下

在这里插入图片描述

此时点击编译,SYS/BIOS系统可以构建出来,只剩下头文件和库文件找不到的问题了。


4. 修改工程属性

在左侧工程视图中,右击工程名,选择Properties,进入工程配置页面。

(1)添加mmWave SDK路径相关的环境变量

Resource->Linked Resources,右侧点击New添加条目MMWAVE_SDK_DIR(名称可自定),路径定位到mmWave SDK安装路径,如下

在这里插入图片描述

设置这个变量的好处是,其他需要定位到SDK路径的地方,只需要使用该变量名进行定位即可。当SDK换了位置,也只需要更改这一个变量的值,十分方便。

(2)修改XDCtools编译指令

在XDC构建SYS/BIOS的过程中,需要让其将枚举的类型设置为int型,否则可能会导致诸如串口无法开启、控制台无法打印输出等问题,具体原理暂时不明。

Build->XDCtools->Advanced Options中,页面下方的Additional complier options,填入"–enum_type=int ",如下

修改XDCtools编译指令

(3)修改编译器的处理器选项

Build->Arm Complier->Processor Options,右侧的Designate code state,从32修改为16,否则会产生一些奇奇怪怪的问题。

在这里插入图片描述

(4)添加编译器包含路径

Build->Arm Complier->Include Options,右侧上方的搜索路径列表,点击带有绿色加号的图标添加,添加目录 ${MMWAVE_SDK_DIR}/Packages

在这里插入图片描述


(5)添加编译器预定义宏

mmWave SDK提供的库在设计的时候考虑了整个系列雷达芯片的兼容性,因此库内有多套代码,通过宏定义来区分需要使用哪一段代码进行编译。为此,我们需要向编译器的预定义符号里添加一些用来表示当前目标芯片的宏。

Build->Arm Complier->Prodefined Symbols,右侧上方添加以下符号(直接复制下面的内容,然后点击框内原先已有的宏,按Ctrl+V即可一次性直接粘贴进去)

SOC_XWR68XX
SUBSYS_MSS
DOWNLOAD_FROM_CCS
MMWAVE_L3RAM_NUM_BANK=6
MMWAVE_SHMEM_TCMA_NUM_BANK=0
MMWAVE_SHMEM_TCMB_NUM_BANK=0
MMWAVE_SHMEM_BANK_SIZE=0x20000
DebugP_ASSERT_ENABLED
_LITTLE_ENDIAN
OBJDET_NO_RANGE
ISK

添加成功后的效果如下

在这里插入图片描述


(6)更改编译器的高级选项

此处需要更改Runtime Model Options内的选项,同样也是将enum类型设置为int,与在XDCtools中的设置保持一致。

Build->Arm Complier->Advanced Options,右侧Designate enum type更改为int类型

在这里插入图片描述

(7)设定包含的库文件和库文件路径

大部分驱动的函数都封装成库提供给用户了,所以需要将库文件添加到连接器的搜索路径中,否则会出现未解析符号的问题。

Build->Arm Linker->File Search Path,上方添加如下内容(一样可以直接复制过去)

libosal_xwr68xx.aer4f
libesm_xwr68xx.aer4f
libtestlogger_xwr68xx.aer4f
libgpio_xwr68xx.aer4f
libsoc_xwr68xx.aer4f
libpinmux_xwr68xx.aer4f
libcrc_xwr68xx.aer4f
libuart_xwr68xx.aer4f
libmailbox_xwr68xx.aer4f
libmmwavelink_xwr68xx.aer4f
libmmwave_xwr68xx.aer4f
libadcbuf_xwr68xx.aer4f
libdma_xwr68xx.aer4f
libedma_xwr68xx.aer4f
libcli_xwr68xx.aer4f
libhwa_xwr68xx.aer4f
libdpm_xwr68xx.aer4f
libmathutils.aer4f
libcbuff_xwr68xx.aer4f
libhsiheader_xwr68xx.aer4f
librangeproc_hwa_xwr68xx.aer4f
libdpedma_hwa_xwr68xx.aer4f
libqspi_xwr68xx.aer4f
libqspiflash_xwr68xx.aer4f
libsleep_xwr68xx.aer4f
rtsv7R4_T_le_v3D16_eabi.lib

下方添加如下内容,其中MMWAVE_SDK_DIR和前面设定Linked Resources时添加的变量名保持一致即可。

${MMWAVE_SDK_DIR}/packages/ti/control/mmwave/lib
${MMWAVE_SDK_DIR}/packages/ti/control/mmwavelink/lib
${MMWAVE_SDK_DIR}/packages/ti/control/dpm/lib
${MMWAVE_SDK_DIR}/packages/ti/drivers/adcbuf/lib
${MMWAVE_SDK_DIR}/packages/ti/drivers/crc/lib
${MMWAVE_SDK_DIR}/packages/ti/drivers/dma/lib
${MMWAVE_SDK_DIR}/packages/ti/drivers/edma/lib
${MMWAVE_SDK_DIR}/packages/ti/drivers/esm/lib
${MMWAVE_SDK_DIR}/packages/ti/drivers/gpio/lib
${MMWAVE_SDK_DIR}/packages/ti/drivers/hwa/lib
${MMWAVE_SDK_DIR}/packages/ti/drivers/mailbox/lib
${MMWAVE_SDK_DIR}/packages/ti/drivers/osal/lib
${MMWAVE_SDK_DIR}/packages/ti/drivers/pinmux/lib
${MMWAVE_SDK_DIR}/packages/ti/drivers/soc/lib
${MMWAVE_SDK_DIR}/packages/ti/drivers/uart/lib
${MMWAVE_SDK_DIR}/packages/ti/utils/cli/lib
${MMWAVE_SDK_DIR}/packages/ti/utils/mathutils/lib
${MMWAVE_SDK_DIR}/packages/ti/datapath/dpu/rangeproc/lib
${MMWAVE_SDK_DIR}/packages/ti/datapath/dpedma/lib
${MMWAVE_SDK_DIR}/packages/ti/drivers/cbuff/lib
${MMWAVE_SDK_DIR}/packages/ti/utils/hsiheader/lib
${MMWAVE_SDK_DIR}/packages/ti/drivers/qspi/lib
${MMWAVE_SDK_DIR}/packages/ti/drivers/qspiflash/lib
${MMWAVE_SDK_DIR}/packages/ti/utils/libsleep/lib
${MMWAVE_SDK_DIR}/packages/ti/utils/testlogger/lib

添加完成后的效果大致如下

在这里插入图片描述

(8)设定链接器的预处理命令

同样地,在此处也需要填入一些预定义的符号,比如r4f_linker.cmd文件中用到的几个宏的大小。

Build->Arm Linker->Advanced Options->Command File PreProcess,上方添加

MMWAVE_L3RAM_NUM_BANK=6
MMWAVE_SHMEM_TCMA_NUM_BANK=0
MMWAVE_SHMEM_TCMB_NUM_BANK=0
MMWAVE_SHMEM_BANK_SIZE=0x20000

添加后效果如下

在这里插入图片描述

点击右下角Apply and Close,再对工程重新编译,可以看到所有错误都消失了。但仍然有一个警告,提示缺少systemHeap段定义。因此打开r4f_linker.cmd文件,手动在SECTIONS内添加:
systemHeap : {} > DATA_RAM

在这里插入图片描述
之后再编译就不会出现问题了。


三、上板测试

经历了千辛万苦,终于把工程配好了,开始做上板的测试。

点击上方工具栏的绿色甲虫,进入调试模式。点击全速运行,控制台每隔一秒正常输出"Hello World!",工程创建成功。

在这里插入图片描述


四、进行一个串口回环的测

最后测试一下串口回环,以下是写好的代码,调用Driver内的uart驱动

#include <stdint.h>
#include <stdlib.h>
#include <stddef.h>
#include <string.h>
#include <stdio.h>
#include <math.h>/* BIOS/XDC Include Files. */
#include <xdc/std.h>
#include <xdc/cfg/global.h>
#include <xdc/runtime/IHeap.h>
#include <xdc/runtime/System.h>
#include <xdc/runtime/Error.h>
#include <xdc/runtime/Memory.h>
#include <ti/sysbios/BIOS.h>
#include <ti/sysbios/knl/Task.h>
#include <ti/sysbios/knl/Event.h>
#include <ti/sysbios/knl/Semaphore.h>
#include <ti/sysbios/knl/Clock.h>
#include <ti/sysbios/heaps/HeapBuf.h>
#include <ti/sysbios/heaps/HeapMem.h>
#include <ti/sysbios/knl/Event.h>
#include <ti/sysbios/family/arm/v7a/Pmu.h>
#include <ti/sysbios/family/arm/v7r/vim/Hwi.h>
#include <ti/sysbios/utils/Load.h>/* mmWave SDK Include Files: */
#include <ti/common/sys_common.h>
#include <ti/common/mmwave_sdk_version.h>
#include <ti/drivers/soc/soc.h>
#include <ti/drivers/esm/esm.h>
#include <ti/drivers/crc/crc.h>
#include <ti/drivers/gpio/gpio.h>
#include <ti/drivers/mailbox/mailbox.h>
#include <ti/drivers/pinmux/pinmux.h>
#include <ti/control/mmwave/mmwave.h>
#include <ti/control/dpm/dpm.h>
#include <ti/drivers/osal/DebugP.h>
#include <ti/drivers/uart/UART.h>
#include <ti/utils/cli/cli.h>
#include <ti/utils/mathutils/mathutils.h>
#include <ti/utils/testlogger/logger.h>MCPI_LOGBUF_INIT(9216);void MM_idleTask(UArg arg0, UArg arg1)
{while(1){System_printf("System running...\n");Task_sleep(5000);}
}void MM_initTask(UArg arg0, UArg arg1)
{/* 串口回环测试 */UART_Params     params;     //串口配置结构体UART_Handle     handle;     //串口句柄Task_Params     taskParams;uint8_t dat;MCPI_Initialize();GPIO_init();                //GPIO初始化UART_init();                //串口初始化/* 串口引脚初始化 *//* 共有两个串口,分别为UART-1和UART-3,序号为0和2 *//* Setup the PINMUX to bring out the MSS UART-1 */Pinmux_Set_FuncSel(SOC_XWR68XX_PINN5_PADBE, SOC_XWR68XX_PINN5_PADBE_MSS_UARTA_TX);Pinmux_Set_OverrideCtrl(SOC_XWR68XX_PINN5_PADBE, PINMUX_OUTEN_RETAIN_HW_CTRL, PINMUX_INPEN_RETAIN_HW_CTRL);Pinmux_Set_FuncSel(SOC_XWR68XX_PINN4_PADBD, SOC_XWR68XX_PINN4_PADBD_MSS_UARTA_RX);Pinmux_Set_OverrideCtrl(SOC_XWR68XX_PINN4_PADBD, PINMUX_OUTEN_RETAIN_HW_CTRL, PINMUX_INPEN_RETAIN_HW_CTRL);/* Setup the PINMUX to bring out the MSS UART-3 */Pinmux_Set_OverrideCtrl(SOC_XWR68XX_PINF14_PADAJ, PINMUX_OUTEN_RETAIN_HW_CTRL, PINMUX_INPEN_RETAIN_HW_CTRL);Pinmux_Set_FuncSel(SOC_XWR68XX_PINF14_PADAJ, SOC_XWR68XX_PINF14_PADAJ_MSS_UARTB_TX);//创建任务,每隔5s打印信息以表示系统正常运行Task_Params_init(&taskParams);taskParams.stackSize = 2*1024;Task_create(MM_idleTask, &taskParams, NULL);UART_Params_init(&params);params.baudRate = 115200;                   //波特率115200params.clockFrequency = 200 * 1000000;      //系统时钟频率200MHzparams.dataLength = UART_LEN_8;             //8bit字长params.isPinMuxDone = 1;                    //已经完成引脚复用初始化params.parityType = UART_PAR_NONE;          //无校验位params.readDataMode = UART_DATA_BINARY;     //按位方式读取数据params.readEcho = UART_ECHO_OFF;            //关闭回显params.readReturnMode = UART_RETURN_FULL;   //完整读取params.stopBits = UART_STOP_ONE;            //1停止位params.writeDataMode = UART_DATA_BINARY;    //按位方式写入(发送)数据handle = UART_open(0, &params);             //打开串口if(handle == NULL){System_printf("UART open fail\n!");return;}else{System_printf("UART open success\n!");while(1){//不断读取收到的数据,并通过串口发送出去//该函数会使进程进入挂起等待状态,不会使其他任务无法执行//可以发现打印任务也可以执行UART_read(handle, &dat, 1);UART_write(handle, &dat, 1);}}
}int main (void)
{int32_t         errCode;    //存放SOC初始化错误代码SOC_Handle      socHandle;  //SOC句柄SOC_Cfg         socCfg;     //SOC配置结构体Task_Params     taskParams; //任务参数ESM_init(0U);               //与安全等有关,可略过/* Initialize the SOC confiugration: *//* 初始化SOC配置结构体 */memset ((void *)&socCfg, 0, sizeof(SOC_Cfg));/* 配置SOC配置结构体 *//* Populate the SOC configuration: */socCfg.clockCfg = SOC_SysClock_INIT;socCfg.mpuCfg = SOC_MPUCfg_CONFIG;/* require to unhalt the DSS if this core is available in selected device */socCfg.dssCfg = SOC_DSSCfg_UNHALT;/* Initialize the SOC Module: This is done as soon as the application is started* to ensure that the MPU is correctly configured. *//* SOC初始化,必须在系统运行后尽快调用该初始化函数 */socHandle = SOC_init (&socCfg, &errCode);/* Initialize the Task Parameters. *//* 创建一个任务用于测试 */Task_Params_init(&taskParams);taskParams.stackSize = 4*1024;      //任务堆栈大小4KBTask_create(MM_initTask, &taskParams, NULL);/* Start BIOS */BIOS_start();return 0;
}

运行结果如下,回环测试成功。

接下来,就可以愉快地使用模板进行开发了。

在这里插入图片描述



参考资料
[FAQ] 如何从头开始创建新的毫米波传感器工程 [Project0]? https://e2echina.ti.com/support/tools/ccs/f/code-composer-studio-forum/210739/faq-project0

这篇关于基于mmWave SDK创建一个IWR6843工程模板(MSS侧)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/786870

相关文章

Ilya-AI分享的他在OpenAI学习到的15个提示工程技巧

Ilya(不是本人,claude AI)在社交媒体上分享了他在OpenAI学习到的15个Prompt撰写技巧。 以下是详细的内容: 提示精确化:在编写提示时,力求表达清晰准确。清楚地阐述任务需求和概念定义至关重要。例:不用"分析文本",而用"判断这段话的情感倾向:积极、消极还是中性"。 快速迭代:善于快速连续调整提示。熟练的提示工程师能够灵活地进行多轮优化。例:从"总结文章"到"用

poj3468(线段树成段更新模板题)

题意:包括两个操作:1、将[a.b]上的数字加上v;2、查询区间[a,b]上的和 下面的介绍是下解题思路: 首先介绍  lazy-tag思想:用一个变量记录每一个线段树节点的变化值,当这部分线段的一致性被破坏我们就将这个变化值传递给子区间,大大增加了线段树的效率。 比如现在需要对[a,b]区间值进行加c操作,那么就从根节点[1,n]开始调用update函数进行操作,如果刚好执行到一个子节点,

C++11第三弹:lambda表达式 | 新的类功能 | 模板的可变参数

🌈个人主页: 南桥几晴秋 🌈C++专栏: 南桥谈C++ 🌈C语言专栏: C语言学习系列 🌈Linux学习专栏: 南桥谈Linux 🌈数据结构学习专栏: 数据结构杂谈 🌈数据库学习专栏: 南桥谈MySQL 🌈Qt学习专栏: 南桥谈Qt 🌈菜鸡代码练习: 练习随想记录 🌈git学习: 南桥谈Git 🌈🌈🌈🌈🌈🌈🌈🌈🌈🌈🌈🌈🌈�

【Python编程】Linux创建虚拟环境并配置与notebook相连接

1.创建 使用 venv 创建虚拟环境。例如,在当前目录下创建一个名为 myenv 的虚拟环境: python3 -m venv myenv 2.激活 激活虚拟环境使其成为当前终端会话的活动环境。运行: source myenv/bin/activate 3.与notebook连接 在虚拟环境中,使用 pip 安装 Jupyter 和 ipykernel: pip instal

poj 1258 Agri-Net(最小生成树模板代码)

感觉用这题来当模板更适合。 题意就是给你邻接矩阵求最小生成树啦。~ prim代码:效率很高。172k...0ms。 #include<stdio.h>#include<algorithm>using namespace std;const int MaxN = 101;const int INF = 0x3f3f3f3f;int g[MaxN][MaxN];int n

在cscode中通过maven创建java项目

在cscode中创建java项目 可以通过博客完成maven的导入 建立maven项目 使用快捷键 Ctrl + Shift + P 建立一个 Maven 项目 1 Ctrl + Shift + P 打开输入框2 输入 "> java create"3 选择 maven4 选择 No Archetype5 输入 域名6 输入项目名称7 建立一个文件目录存放项目,文件名一般为项目名8 确定

uva 1342 欧拉定理(计算几何模板)

题意: 给几个点,把这几个点用直线连起来,求这些直线把平面分成了几个。 解析: 欧拉定理: 顶点数 + 面数 - 边数= 2。 代码: #include <iostream>#include <cstdio>#include <cstdlib>#include <algorithm>#include <cstring>#include <cmath>#inc

uva 11178 计算集合模板题

题意: 求三角形行三个角三等分点射线交出的内三角形坐标。 代码: #include <iostream>#include <cstdio>#include <cstdlib>#include <algorithm>#include <cstring>#include <cmath>#include <stack>#include <vector>#include <

Java 创建图形用户界面(GUI)入门指南(Swing库 JFrame 类)概述

概述 基本概念 Java Swing 的架构 Java Swing 是一个为 Java 设计的 GUI 工具包,是 JAVA 基础类的一部分,基于 Java AWT 构建,提供了一系列轻量级、可定制的图形用户界面(GUI)组件。 与 AWT 相比,Swing 提供了许多比 AWT 更好的屏幕显示元素,更加灵活和可定制,具有更好的跨平台性能。 组件和容器 Java Swing 提供了许多

poj 2104 and hdu 2665 划分树模板入门题

题意: 给一个数组n(1e5)个数,给一个范围(fr, to, k),求这个范围中第k大的数。 解析: 划分树入门。 bing神的模板。 坑爹的地方是把-l 看成了-1........ 一直re。 代码: poj 2104: #include <iostream>#include <cstdio>#include <cstdlib>#include <al