mysql 移植ucos_基于STM32F767的UCOSIII移植学习

(一)移植前的准备

1.HAL库基本工程模板

新建一个工程模块,其中包含LED驱动和串口驱动程序即可,用于验证UCOS-III系统能够正常工作。

2.UCOS-III源码准备

去Micrium官网下载最新的UCOSIII源码,下载地址:Micrium官网下载地址,没有注册过的用户需要注册一下,我自己注册的过程都是泪。由于我选择的是正点原子F7的开发板,所以在官网上选择合适源码时就选择F7的。具体版本选择下图中19年2月6号的版本:

cd1f4f1ae1c08fe60db39fbd799d1062.png

下载完成之后发现,发现源码文件夹中东西很多大部分都是和网络移植相关的,目前我们只移植最新版本的UCOSIII,所以这些文件夹都不需要去看。进入源码目录下的uCOS-III文件夹,发现里面只有针对IAR的编译器的文件,难道MDK就凉凉了吗?凡是先不要慌,虽然编译器不同,但是实现的功能就是相同的,并不会影响到移植后操作系统的运行。

UCOSIII的移植

(一)源码文件的摘选

1.在准备好的工程文件夹下新建一个UCOS-III目录,用于存放和UCOSIII相关的所有代码。在UCOS-III目录下新建如下目录,用于UCOS源码的分类。

51de5140dc9b460bebc557521148f0bc.png

(1)将源码目录Micrium_STM32F746G-DISCO_Crypto\Micrium\Software\uC-CPU下的文件全部拷贝到我们创建的uC-CPU目录下,为了减少文件夹的个数,我把ARM-Cortex-M\ARMv7-M目录下和ARM-Cortex-M\ARMv7-M\ARM目录下的文件都移到了自己创建的uC-CPU目录下了。这里我要说明下一下IAR和ARM目录下的文件,除了汇编文件有些不同以外,头文件内容都是相同的,这边选择ARM目录下的汇编文件还是IAR目录下的汇编文件都行,因为我们都是要修改成MDK支持的形式的。

(2)将源码目录Micrium_STM32F746G-DISCO_Crypto\Micrium\Software\uC-LIB文件夹下的文件全部拷贝到自己创建的uC-LIB目录下,这边我直接把Micrium\Software\uC-LIB\Ports\ARM-Cortex-M4\RealView目录下的文件和其他文件放在了一个文件夹下,具体如下图所示:

91b8f2f843a3eebc1f3fe4d0f2440127.png

由于我们使用的是MDK编译,所以这边选择的是RealView目录下的汇编文件,具体什么原因的话,网上有很多解释,我就不复制他们的解释了。

(3)将Micrium_STM32F746G-DISCO_Crypto\Micrium\Software\uCOS-III目录下的文件全部拷贝到自己创建uCOS-III目录下。点开Ports的目录,发现最后只有一个IAR文件下,这边我们先不用关注,只需将文件都拷贝过来,具体内容如下图所示:

dd82318fa80656e64aab5d6541353dc0.png

7673f8956045fefac8fcf79c5f8c7603.png

(4)将源码例程目录Micrium_STM32F746G-DISCO_Crypto\ST\STM32F746G_Disco\Crypto下的部分文件和OS3下的部分文件拷贝到自己创建的UCOS-CONFIG文件夹下。具体文件如下图所示:

dd3101b2b677c8fe77d72592161c1022.png

在源码例程文件中,发现很多都是网络相关的移植代码,所以没有拷贝过来。但是有一个clk_cfg.h很明显不是和网络相关的,为什么不移植过来呢?从名字上看就是和时钟相关的,难道说不需要时钟配置吗?时钟当然是需要配置的,但是裸机工程中时钟已经配置OK了,这边和时钟相关的文件也就不需要了,后面操作系统的时钟需要自己通过HAL库配置,这边就不详细说明了。

(5)将Micrium_STM32F746G-DISCO_Crypto\ST\BSP\STM32F746G_Disco目录下的bsp_cpu.c文件拷贝到自己创建的UCOS-BSP目录下,并且新建一个bsp_cpu.h头文件(用于包含操作系统的头文件)。其他文件都不需要拷贝,大多是和芯片外设相关的初始化。

(二)文件添加

(1)打开MDK工程,将拷贝的文件添加至工程当中,具体内容如下图所示:

6187807b908de845fb6b62aef93ecc84.png

0be22228c179297a2f3f00c0f9df90dd.png

1a71473c20d8ce32ce0abc1efae1e08c.png

9c3f705510ff2d7555a027f40b2e2521.png

b4d6c9059b1f43ed242d234a3e3bb633.png

以及头文件路径添加,如下图所示:

9e7da18f5529b76be5afc8e32ae52d2c.png

上述文件都添加完成之后,点击编译,提示下图错误:

8b28435e2022e0ccbbe70ad1cba586e3.png

出现unknown opcode什么的错误,而且出现在os_cpu_a.asm文件中,那就打开这个汇编文件看一下,是什么问题,发现PUBLIC关键字都没有标蓝,那肯定是由于这个关键字不是MDK的关键字,所以讲PUBLIC修改为MDK所用的关键字EXPORT,具体EXPORT这个关键字怎么来的,我是查看了其他版本的UCOS在STM32的移植,看到用的是这个关键字,就直接抄过来了。还有错误与FPU相关,如下图所示:

#ifdef __ARMVFP__

EXPORT OS_CPU_FP_Reg_Push

EXPORT OS_CPU_FP_Reg_Pop

#endif

查看了正点原子的移植手册,发现上面说到

Cortex-M7内核中有个Lazy Stacking的功能,如果使用FPU功能的话就需要关闭这个功能,需要修改startup_stm32f767xx.s汇编文件,在里面关闭这个功能。

具体代码如下所示:

IF {FPU} != "SoftVFP"

; Enable Floating Point Support at reset for FPU

LDR.W R0, =0xE000ED88 ; Load address of CPACR register

LDR R1, [R0] ; Read value at CPACR

ORR R1, R1, #(0xF <<20) ; Set bits 20-23 to enable CP10 and CP11 coprocessors

; Write back the modified CPACR value

STR R1, [R0] ; Wait for store to complete

DSB

; Disable automatic FP register content

; Disable lazy context switch

LDR.W R0, =0xE000EF34 ; Load address to FPCCR register

LDR R1, [R0]

AND R1, R1, #(0x3FFFFFFF) ; Clear the LSPEN and ASPEN bits

STR R1, [R0]

ISB ; Reset pipeline now the FPU is enabled

ENDIF

在startup_stm32f767xx.s中就如下图所示:

892206aa835e2c5ff8e90914c0674ced.png

修改完这些,接下去就解决… error: A1163E: Unknown opcode ARMVFP , expecting opcode or Macro 这个错误。将原先的判断语句修改为如下语句:

IF {FPU} != "SoftVFP"

EXPORT OS_CPU_FP_Reg_Push

EXPORT OS_CPU_FP_Reg_Pop

ENDIF

IF {FPU} != "SoftVFP"

OS_CPU_FP_Reg_Push

MRS R1, PSP ; PSP is process stack pointer

CBZ R1, OS_CPU_FP_nosave ; Skip FP register save the first time

VSTMDB R0!, {S16-S31}

LDR R1, =OSTCBCurPtr

LDR R2, [R1]

STR R0, [R2]

OS_CPU_FP_nosave

BX LR

ENDIF

IF {FPU} != "SoftVFP"

OS_CPU_FP_Reg_Pop

VLDMIA R0!, {S16-S31}

LDR R1, =OSTCBHighRdyPtr

LDR R2, [R1]

STR R0, [R2]

BX LR

ENDIF

修改完成之后,再次编译,依旧存在 error: A1163E: Unknown opcode RSEG , expecting opcode or Macro 的错误,这主要是由于编译器关键字的问题,所以这里直接借鉴其他其他版本在MDK上的移植。具体修改代码如下:

PRESERVE8

THUMB

AREA CODE, CODE, READONLY

再次编译,发现这个汇编文件中还有一个警告: warning: A1581W: Added 2 bytes of padding at address 0x112,这是提示地址没对齐,那就在末尾添加一个对齐指令,具体代码如下:

OS_CPU_PendSVHandler

CPSID I ; Cortex-M7 errata notice. See Note #5

MOV32 R2, OS_KA_BASEPRI_Boundary ; Set BASEPRI priority level required for exception preemption

LDR R1, [R2]

MSR BASEPRI, R1

DSB

ISB

CPSIE I

MRS R0, PSP ; PSP is process stack pointer

STMFD R0!, {R4-R11, R14} ; Save remaining regs r4-11, R14 on process stack

MOV32 R5, OSTCBCurPtr ; OSTCBCurPtr->StkPtr = SP;

LDR R1, [R5]

STR R0, [R1] ; R0 is SP of process being switched out

; At this point, entire context of process has been saved

MOV R4, LR ; Save LR exc_return value

BL OSTaskSwHook ; Call OSTaskSwHook() for FPU Push & Pop

MOV32 R0, OSPrioCur ; OSPrioCur = OSPrioHighRdy;

MOV32 R1, OSPrioHighRdy

LDRB R2, [R1]

STRB R2, [R0]

MOV32 R1, OSTCBHighRdyPtr ; OSTCBCurPtr = OSTCBHighRdyPtr;

LDR R2, [R1]

STR R2, [R5]

ORR LR, R4, #0x04 ; Ensure exception return uses process stack

LDR R0, [R2] ; R0 is new process SP; SP = OSTCBHighRdyPtr->StkPtr;

LDMFD R0!, {R4-R11, R14} ; Restore r4-11, R14 from new process stack

MSR PSP, R0 ; Load PSP with new process SP

MOV32 R2, #0 ; Restore BASEPRI priority level to 0

MSR BASEPRI, R2

BX LR ; Exception return will restore remaining context

ALIGN

END

再次编译,os_cpu_a.asm文件内没有错误,还有两个小错误:

8d233f8d6e85d12f82387c994464b212.png

将os_cpu_c.c中os.h的头文件路径修改意见,将bsp_cpu.c中的bsp_clk.h头文件注释掉,再次编译。报错信息如下图:

8f5dd42cfc1120818deea67af93791e7.png

发现报错信息都在bsp_cpu.c当中,而且都是和时钟频率相关的,打开源码例程中的bsp_clk.c文件,查看BSP_ClkFreqGet()函数,发现里面调用的函数不就是HAL库提供的吗,那我们直接将bsp_cpu.c中的时钟获取函数修改为HAL库提供的函数,不就OK了吗。修改后的代码如下所示:

#if (CPU_CFG_TS_TMR_EN == DEF_ENABLED)

void CPU_TS_TmrInit (void)

{

CPU_INT32U fclk_freq;

CPU_INT32U reg_val;

/* ---- DWT WRITE ACCESS UNLOCK (CORTEX-M7 ONLY!!) ---- */

reg_val = CPU_BSP_REG_DWT_LSR; /* Read lock status register. */

if ((reg_val & CPU_BSP_BIT_DWT_LSR_SLI) != 0) { /* Check if Software lock control mechanism exits */

if ((reg_val & CPU_BSP_BIT_DWT_LSR_SLK) != 0) { /* Check if DWT access needs to be unlocked */

CPU_BSP_REG_DWT_LAR = CPU_BSP_DWT_LAR_KEY; /* Unlock DWT write access. */

}

}

fclk_freq = HAL_RCC_GetHCLKFreq();

CPU_BSP_REG_DEMCR |= DEF_BIT_24; /* Set DEM_CR_TRCENA */

CPU_BSP_REG_DWT_CR |= DEF_BIT_00; /* Set DWT_CR_CYCCNTENA */

CPU_TS_TmrFreqSet((CPU_TS_TMR_FREQ)fclk_freq);

}

#endif

#if (CPU_CFG_TS_32_EN == DEF_ENABLED)

CPU_INT64U CPU_TS32_to_uSec (CPU_TS32 ts_cnts)

{

CPU_INT64U ts_us;

CPU_INT64U fclk_freq;

fclk_freq = HAL_RCC_GetHCLKFreq();

ts_us = ts_cnts / (fclk_freq / DEF_TIME_NBR_uS_PER_SEC);

return (ts_us);

}

#endif

#if (CPU_CFG_TS_64_EN == DEF_ENABLED)

CPU_INT64U CPU_TS64_to_uSec (CPU_TS64 ts_cnts)

{

CPU_INT64U ts_us;

CPU_INT64U fclk_freq;

fclk_freq = HAL_RCC_GetHCLKFreq();

ts_us = ts_cnts / (fclk_freq / DEF_TIME_NBR_uS_PER_SEC);

return (ts_us);

}

#endif

修改完之后,再次编译,发现了很多重复定义的错误,都适合__dbg_ucos-iii.c文件相关,那就直接移除掉这个文件,再编译看看结果如何。

编译之后发现只有一个未定义的错误,打开os_cpu.h头文件,发现了下面这行代码:

#define OS_TASK_SW_SYNC() __ISB()

明明定义了,却还是提示未定义的错误,那我搜索了一下__ISB()函数,在cmsis_armcc.h中明确定义了,难道没添加头文件引起的吗,那就添加头文件再编译一下,报错信息更多了,那很明显不是这个问题了。看到cmsis_armcc.h中有这一行代码:

#define __ISB() do {\

__schedule_barrier();\

__isb(0xF);\

__schedule_barrier();\

} while (0U)

那就直接修改成

#define OS_TASK_SW_SYNC() __isb(0xF)

这样编译倒是没问题了。但是系统运行起来有没有问题就不知道,先这么做吧,这个头文件中还有一行代码也需要修改:

#ifdef__ARMVFP__

#define OS_CPU_ARM_FP_EN 1u

#else

#define OS_CPU_ARM_FP_EN 0u

#endif

修改为

#ifdef __TARGET_FPU_SOFTVFP

#define OS_CPU_ARM_FP_EN 1u

#else

#define OS_CPU_ARM_FP_EN 0u

#endif

编译后无错误。现在这系统能够正常运行起来了吗?讲实话我也不太清楚,那就测试一下吧。

(三)测试系统

拷贝如下代码至main.c中。

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include "bsp_cpu.h"

//任务优先级

#define START_TASK_PRIO2

//任务堆栈大小

#define START_STK_SIZE 512

//任务控制块

OS_TCB StartTaskTCB;

//任务堆栈

CPU_STK START_TASK_STK[START_STK_SIZE];

//任务函数

void start_task(void *p_arg);

//任务优先级

#define LED0_TASK_PRIO3

//任务堆栈大小

#define LED0_STK_SIZE 128

//任务控制块

OS_TCB Led0TaskTCB;

//任务堆栈

CPU_STK LED0_TASK_STK[LED0_STK_SIZE];

void led0_task(void *p_arg);

//任务优先级

#define LED1_TASK_PRIO4

//任务堆栈大小

#define LED1_STK_SIZE 128

//任务控制块

OS_TCB Led1TaskTCB;

//任务堆栈

CPU_STK LED1_TASK_STK[LED1_STK_SIZE];

//任务函数

void led1_task(void *p_arg);

//任务优先级

#define FLOAT_TASK_PRIO5

//任务堆栈大小

#define FLOAT_STK_SIZE256

//任务控制块

OS_TCBFloatTaskTCB;

//任务堆栈

CPU_STKFLOAT_TASK_STK[FLOAT_STK_SIZE];

//任务函数

void float_task(void *p_arg);

/*****************************************************************************************************************************************

* Function Name: main

* Input: None

* Output: None

* Returns: None

* Description: 主函数

* Note: None

*****************************************************************************************************************************************/

int main(void)

{

OS_ERR err;

CPU_SR_ALLOC();

HW_Init();

MT_Init();

OSInit(&err); //初始化UCOSIII

CPU_CRITICAL_ENTER(); //进入临界区

//创建开始任务

OSTaskCreate((OS_TCB * )&StartTaskTCB,//任务控制块

(CPU_CHAR* )"start task", //任务名字

(OS_TASK_PTR )start_task, //任务函数

(void* )0,//传递给任务函数的参数

(OS_PRIO )START_TASK_PRIO, //任务优先级

(CPU_STK * )&START_TASK_STK[0],//任务堆栈基地址

(CPU_STK_SIZE)START_STK_SIZE/10,//任务堆栈深度限位

(CPU_STK_SIZE)START_STK_SIZE,//任务堆栈大小

(OS_MSG_QTY )0,//任务内部消息队列能够接收的最大消息数目,为0时禁止接收消息

(OS_TICK )0,//当使能时间片轮转时的时间片长度,为0时为默认长度,

(void * )0,//用户补充的存储区

(OS_OPT )OS_OPT_TASK_STK_CHK|OS_OPT_TASK_STK_CLR|OS_OPT_TASK_SAVE_FP, //任务选项,为了保险起见,所有任务都保存浮点寄存器的值

(OS_ERR * )&err);//存放该函数错误时的返回值

CPU_CRITICAL_EXIT();//退出临界区

OSStart(&err); //开启UCOSIII

while(1)

{

}

}

//开始任务函数

void start_task(void *p_arg)

{

OS_ERR err;

CPU_SR_ALLOC();

p_arg = p_arg;

CPU_Init();

#if OS_CFG_STAT_TASK_EN > 0u

OSStatTaskCPUUsageInit(&err); //统计任务

#endif

#ifdef CPU_CFG_INT_DIS_MEAS_EN//如果使能了测量中断关闭时间

CPU_IntDisMeasMaxCurReset();

#endif

#ifOS_CFG_SCHED_ROUND_ROBIN_EN//当使用时间片轮转的时候

//使能时间片轮转调度功能,设置默认的时间片长度s

OSSchedRoundRobinCfg(DEF_ENABLED,10,&err);

#endif

CPU_CRITICAL_ENTER();//进入临界区

//创建LED0任务

OSTaskCreate((OS_TCB * )&Led0TaskTCB,

(CPU_CHAR* )"led0 task",

(OS_TASK_PTR )led0_task,

(void* )0,

(OS_PRIO )LED0_TASK_PRIO,

(CPU_STK * )&LED0_TASK_STK[0],

(CPU_STK_SIZE)LED0_STK_SIZE/10,

(CPU_STK_SIZE)LED0_STK_SIZE,

(OS_MSG_QTY )0,

(OS_TICK )0,

(void * )0,

(OS_OPT )OS_OPT_TASK_STK_CHK|OS_OPT_TASK_STK_CLR|OS_OPT_TASK_SAVE_FP,

(OS_ERR * )&err);

//创建LED1任务

OSTaskCreate((OS_TCB * )&Led1TaskTCB,

(CPU_CHAR* )"led1 task",

(OS_TASK_PTR )led1_task,

(void* )0,

(OS_PRIO )LED1_TASK_PRIO,

(CPU_STK * )&LED1_TASK_STK[0],

(CPU_STK_SIZE)LED1_STK_SIZE/10,

(CPU_STK_SIZE)LED1_STK_SIZE,

(OS_MSG_QTY )0,

(OS_TICK )0,

(void * )0,

(OS_OPT )OS_OPT_TASK_STK_CHK|OS_OPT_TASK_STK_CLR|OS_OPT_TASK_SAVE_FP,

(OS_ERR * )&err);

//创建浮点测试任务

OSTaskCreate((OS_TCB * )&FloatTaskTCB,

(CPU_CHAR* )"float test task",

(OS_TASK_PTR )float_task,

(void* )0,

(OS_PRIO )FLOAT_TASK_PRIO,

(CPU_STK * )&FLOAT_TASK_STK[0],

(CPU_STK_SIZE)FLOAT_STK_SIZE/10,

(CPU_STK_SIZE)FLOAT_STK_SIZE,

(OS_MSG_QTY )0,

(OS_TICK )0,

(void * )0,

(OS_OPT )OS_OPT_TASK_STK_CHK|OS_OPT_TASK_STK_CLR|OS_OPT_TASK_SAVE_FP,

(OS_ERR * )&err);

CPU_CRITICAL_EXIT();//进入临界区

OSTaskSuspend((OS_TCB*)&StartTaskTCB,&err);//挂起开始任务

}

//led0任务函数

void led0_task(void *p_arg)

{

OS_ERR err;

p_arg = p_arg;

while(1)

{

HW_Led0_On(); //LED0打开

OSTimeDlyHMSM(0,0,0,200,OS_OPT_TIME_HMSM_STRICT,&err); //延时200ms

HW_Led0_Off(); //LED0关闭

OSTimeDlyHMSM(0,0,0,500,OS_OPT_TIME_HMSM_STRICT,&err); //延时500ms

}

}

//led1任务函数

void led1_task(void *p_arg)

{

OS_ERR err;

p_arg = p_arg;

while(1)

{

HW_Led1_On();

HW_Delay_ms(500);//延时500ms

HW_Led1_Off();

HW_Delay_ms(500);

OSTimeDlyHMSM(0,0,0,100,OS_OPT_TIME_HMSM_STRICT,&err);

}

}

//浮点测试任务

void float_task(void *p_arg)

{

OS_ERR err;

CPU_SR_ALLOC();

static double double_num=0.00;

while(1)

{

double_num+=0.01f;

CPU_CRITICAL_ENTER();//进入临界区

printf("double_num的值为: %.4f\r\n",double_num);

CPU_CRITICAL_EXIT();//退出临界区

OSTimeDlyHMSM(0,0,0,20,OS_OPT_TIME_HMSM_STRICT,&err);

}

}

编译后,烧写进开发板,查看现象:LED灯没亮;那系统肯定没有运行起来,通过Debug看看哪里出问题了,结果发现程序停在了如下地方:

5c00593b063fef4fbfe39525dcabb132.png

那说明是PendSV中断处理出了问题,看看整个工程中哪里需要调整。os_cpu_a.asm汇编文件中定义了OS_CPU_PendSVHandler函数,这是Micrium官方移植例程中修改了PendSV中断函数的名称,所以这边需要修改回来,然后再编译报该函数的重定义错误。

5e48161e47f76919422e7905b3270f70.png

这边屏蔽掉stm32f7xx_it.c中的PendSV_Handler函数定义,再次编译;没有报错,那就再下载验证一下。结果还是失败了,那就再Debug一下,看看是哪里的问题,发现程序运行之后,开始任务调度之后就挂在空闲任务上。找来找去没发现什么问题,本来都准备放弃了,后来看到操作系统的时间都是通过滴答定时器中断产生的,然后仔细看了一下代码,虽然使用了滴答定时器,但是没有使用中断,那赶紧加上试试,顺便将stm32f7xx_it.h中定义的滴答定时器中断函数屏蔽掉。编译之后没报错,那就在测试一下。终于,LED灯如愿的闪烁起来 ,串口也正常工作起来了,说明操作系统真正运行起来了。

d6625427a5049117f5dbd06f51e4ef1e.png

下面附上移植后的工程。

链接:https://pan.baidu.com/s/1AGw1SWNMI_BpX7NLsxvQdg

提取码:bzne

复制这段内容后打开百度网盘手机App,操作更方便哦

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/487954.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

美国5G到底怎么了?

来源&#xff1a;网优雇佣军美国司法部长威廉巴尔&#xff08;William Barr&#xff09;在2月6日应华盛顿智库“战略与国际研究中心”&#xff08;CSIS, Center for Strategic & International Studies&#xff09;邀请&#xff0c;参加了“中国倡议”会议&#xff08;Chin…

SQL实践篇(一):使用WebSQL在H5中存储一个本地数据库

文章目录 简介本地存储都有哪些&#xff1f;如何使用WebSQL打开数据库事务操作SQL执行 在浏览器端做一个英雄的查询页面如何删除本地存储参考文献 简介 WebSQL是一种操作本地数据库的网页API接口&#xff0c;通过它&#xff0c;我们可以操作客户端的本地存储。 WebSQL曾经是H…

预计2024年之前载人登月!NASA授予马斯克贝索斯公司大单

来源&#xff1a;小小据外媒报道&#xff0c;当地时间周四&#xff0c;美国宇航局(NASA)宣布选中埃隆马斯克(Elon Musk)旗下美国太空探索技术公司SpaceX、杰夫贝索斯(Jeff Bezos)的蓝色起源公司&#xff08;Blue Origin&#xff09;和Dynetics为其设计和建造月球着陆系统&#…

java 遗传算法_[原]遗传算法Java实现源代码

【Title】[原]遗传算法Java实现源代码【Date】2013-04-07【Abstract】以前学习遗传算法时&#xff0c;用Java实现的遗传算法程序&#xff0c;现整理分享出来。【Keywords】wintys、遗传、算法、algorithm、种群、基因、个体、进化、染色体、适应度、Rosenbrock【Environment】W…

理解进化的五座“桥”

来源&#xff1a;原理古往今来&#xff0c;达尔文是不是最具革命性的科学家之一&#xff1f;如果革命指的是把一个已经公认的学说颠倒过来&#xff0c;那挑战者还有很多&#xff0c;至少包括牛顿、爱因斯坦和量子力学的奠基者。这些物理学家超群绝伦的智慧能量&#xff0c;可能…

【AI】【机器人】AI与机器人的42个终极问题与解答

来源&#xff1a;产业智能官 未来智能实验室的主要工作包括&#xff1a;建立AI智能系统智商评测体系&#xff0c;开展世界人工智能智商评测&#xff1b;开展互联网&#xff08;城市&#xff09;云脑研究计划&#xff0c;构建互联网&#xff08;城市&#xff09;云脑技术和企业图…

With you With me

With you With me 回来了&#xff0c;一起从零开始... 据说每一个敢说从零开始的都特么是个大牛&#xff08;for example hiphop-Man欧阳靖&#xff09;... 这些年的时间多有自己问自己&#xff0c;你特么到底在迷茫什么&#xff0c;想不通就去撞墙啊&#xff01;&#xff01;…

志澄观察:卫星互联网——太空经济新动力

图1 卫星互联网的组成来源&#xff1a;远望智库 引 言2020年04月20日国家发改委首次明确&#xff0c;将卫星互联网列入我国新型基础设施的范围&#xff0c;这项重大的战略决策&#xff0c;大大鼓舞了我国商业航天行业的信心。另一方面&#xff0c;2020年3月27日,在发展低…

一文读懂电磁学发展史[图文版]

来源&#xff1a;电子万花筒电磁学或称电动力学或经典电动力学。之所以称为经典&#xff0c;是因为它不包括现代的量子电动力学的内容。电动力学这样一个术语使用并不是非常严格&#xff0c;有时它也用来指电磁学中去除了静电学、静磁学后剩下的部分&#xff0c;是指电磁学与力…

人机智能既不是人类智能,也不是人工智能

来源&#xff1a;人机与认知实验室从前&#xff0c;一个教授&#xff0c;去一个穷乡僻壤里头坐船过江&#xff0c;就问船上的船工&#xff1a;你学点数学没有&#xff1f;没有。你学点物理没有&#xff1f;没有。那懂不懂计算机啊&#xff1f;不懂。教授感叹这三样都不会&#…

赛博朋克之后的科幻建筑是什么样的?

来源&#xff1a;苇草智酷粗略地浏览一下 tumblr 或 Pinterest 论坛的兴趣推送&#xff0c;你会发现我最近痴迷于科幻作品美学。更具体地说&#xff0c;我一直在想&#xff0c;在过去35年甚至更久时间里流行的设计美学——赛博朋克&#xff08;Cyberpunk&#xff09;之后&#…

牛客网java_牛客网java

1&#xff1a;下列代码运行的结果是什么&#xff1f;public classP {public static int abc 123;static{System.out.println("P is init");}}public class S extendsP {static{System.out.println("S is init");}}public classTest {public static voidma…

AMD 和 Intel 之战:CPU 哪家强?

来源&#xff1a;嵌入式资讯精选作者 | Paul Alcorn译者 | 弯月&#xff0c;责编 | 郭芮以下为译文&#xff1a;不论是选游戏CPU还是桌面应用的CPU&#xff0c;我们只有两种选择&#xff1a;AMD或者英特尔。两家都有各自的粉丝&#xff0c;所以想买CPU的人很难获得中肯的建议&a…

issubclass在python中的意思_python基础之类的isinstance与issubclass、反射

一 isinstance(obj,cls)和issubclass(sub,super)isinstance(obj,cls)检查是否obj是否是类 cls 的对象class Foo:passobj Foo()print(isinstance(obj,Foo))issubclass(sub, super)检查sub类是否是 super 类的派生类class Foo:passclass Bar(Foo):passprint(issubclass(Bar,Foo)…

华为的汽车芯片布局

来源&#xff1a;电子发烧友综合报道&#xff0c;内容参考自雷锋网、IT之家、CnBeat&#xff0c;转载请注明以上来源由于政策扶持&#xff0c;新能源汽车发展迅速&#xff0c;华为也开始进军新能源汽车市场&#xff0c;最近动作频繁&#xff0c;例如联合意法半导体研发汽车芯片…

大热下的 GNN 研究面临哪些“天花板”?未来的重点研究方向又在哪?

作为脱胎于图论研究的热门研究领域&#xff0c;图神经网络&#xff08;GNN&#xff09;与经典的 WL 算法有诸多相似之处。众所周知&#xff0c;强大的 WL 算法对于聚合函数的单射性质有很强的要求&#xff0c;那么强大的 GNN 应该具备哪些性质呢&#xff1f;研究大热下&#xf…

java将一个对象赋值给另一个对象_java一个对象赋值给另一个对象,支持平铺类和层级类间的互转...

场景&#xff1a;将一个层级类对象(领域驱动model对象)转换为平铺类对象(view)src对象&#xff0c;(红框为子对象)target对象(平铺对象)代码思路&#xff0c;先递归反射遍历出所有字段&#xff0c;存到一个map里&#xff0c;再递归赋值给target对象缺陷&#xff1a;不同子对象间…

新基建的内涵、意义和隐忧 ,基于互联网大脑模型的分析

2020年4月20日上午&#xff0c;国家发改委召开4月份例行新闻发布会&#xff0c;首次就“新基建”概念和内涵作出正式的解释。“新型基础设施是以新发展理念为引领&#xff0c;以技术创新为驱动&#xff0c;以信息网络为基础&#xff0c;面向高质量发展需要&#xff0c;提供数字…

罗兰贝格84页白皮书:一文看懂中国ICT产业新黄金十年

来源&#xff1a;智东西中国信息和通信技术产业&#xff08;下称“ICT产业”&#xff09;蓬勃发展的黄金三十年&#xff0c;展现出了强大的市场吸引力与发展潜能。从上个世纪九十年代至今&#xff0c;ICT产业收入规模增长了340倍&#xff0c;保持双位数增长&#xff0c;领先全球…

2020年五大虚拟现实和增强现实趋势

来源&#xff1a;AR工业应用2019年是VR/AR增长的一年&#xff0c;用户戴上VR头显就可以沉浸在计算机生成的环境中&#xff0c;VR在设计、营销、教育、培训和零售领域都有大量的需求。AR则通过屏幕或头显将计算机图像叠加到用户的真实世界视图上&#xff0c;预计2020年全球在XR技…