hgxj_rt
hgxj_rt

注册于 2 years ago

回答
0
文章
0
关注者
0

thread = pt->polling_thread;

timeout = rt_tick_from_millisecond(msec);

level = rt_hw_interrupt_disable();

if (timeout != 0 && !pt->triggered)
{
rt_thread_suspend(thread);


。。。。。

追踪一步步看源码菜才明白,在poll里吧当前的polling_thread给suspend了,所以finsh是不能用的。那么问题来了,这个时候要用finsh咋办,还得再看看代码:)

现在测试发现一个问题,就是在启动tcpip链接后,tshell线程就无法在进去了,推出tcpip线程后就可以再进tshell线程。tshell线程状态也是运行态,这个问题目前还没找出来,还是再tcpip链接后shell不能输入?

基本调通了,还是vscode不熟,完后网络配置这块有常见问题说的现象,网卡共享重新开启下就ok了。
qemu1.png

    本帖最后由 hgxj_rt 于 2019-12-27 18:37 编辑


组件里在POSIX层与C标准库下 使能 Enable libc APIs from toolchain,编译还是报错

TIM截图20191227183634.png

都试过了:'(,换了台电脑,直接运行,天气预报的demo直接就可以跑,显示上海的天气预报,试了下lcd例子,直接在板子上就可以运行。之前用的那台电脑估计是有啥问题,vscode,python都重装了,win7 64位的系统,怎么弄lcd都不显示。目前感觉解决不了这个问题。:LTIM截图20191210225713.png

Summer_gift 发表于 2019-9-25 16:02
根据楼主的情况,其实只用 128k 的那块 ram 也并不会出错,只需要在 board.h 里面规定好所使用的那块 ram ...


现在还有个问题,看我说清楚了没,
链接脚本如下:
RW_IRAM2 0x10000000 0x00008000  {  ; RW data
.ANY (+RW +ZI)

我的理解就是链接脚本这么写后,就指定了系统的运行内存从0x10000000开始,那么这个在实际编译后是怎么实现的,没太明白。

Summer_gift 发表于 2019-9-25 16:02
根据楼主的情况,其实只用 128k 的那块 ram 也并不会出错,只需要在 board.h 里面规定好所使用的那块 ram ...


是的,我又重新看了下BSP制作教程 3.2.3 堆内存配置讲解说明了堆分配空间的问题。详细看了BSP中pandora例程,基本明白了,0x10000000 开始的 32k 内存用作系统的运行内存,所以堆分配可以直接用以下代码,
#define STM32_SRAM1_SIZE               (96)
#define STM32_SRAM1_START (0x20000000)
#define STM32_SRAM1_END (STM32_SRAM1_START + STM32_SRAM1_SIZE * 1024)
#define HEAP_BEGIN STM32_SRAM1_START
#define HEAP_END STM32_SRAM1_END

我直接复制这个代码到L451工程下,链接脚本没有改为
RW_IRAM2 0x10000000 0x00008000  {  ; RW data
.ANY (+RW +ZI)

所以程序直接就跑飞了。
如果只用 128k ram,那么用
#define STM32_SRAM1_SIZE               (128)
#define STM32_SRAM1_START (0x20000000)
#define STM32_SRAM1_END (STM32_SRAM1_START + STM32_SRAM1_SIZE * 1024)

#ifdef __CC_ARM
extern int Image$RW_IRAM1$ZI$Limit;
#define HEAP_BEGIN ((void *)&Image$RW_IRAM1$ZI$Limit)
#elif __ICCARM__
#pragma section="CSTACK"
#define HEAP_BEGIN (__segment_end("CSTACK"))
#else
extern int __bss_end;
#define HEAP_BEGIN ((void *)&__bss_end)
#endif

#define HEAP_END STM32_SRAM1_END

是完全可以的

    本帖最后由 hgxj_rt 于 2019-9-11 23:27 编辑


问题找到了:lol
#define STM32_FLASH_START_ADRESS       ((uint32_t)0x08000000)
#define STM32_FLASH_SIZE (512 * 1024)
#define STM32_FLASH_END_ADDRESS ((uint32_t)(STM32_FLASH_START_ADRESS + STM32_FLASH_SIZE))

#define STM32_SRAM1_SIZE (96)
#define STM32_SRAM1_START (0x20000000)
#define STM32_SRAM1_END (STM32_SRAM1_START + STM32_SRAM1_SIZE * 1024)

#define HEAP_BEGIN STM32_SRAM1_START
#define HEAP_END STM32_SRAM1_END
这个是bsp\stm32中board.h对HEAP_BEGIN的定义。
#ifdef __CC_ARM
extern int Image$RW_IRAM1$ZI$Limit;
#define HEAP_BEGIN (&Image$RW_IRAM1$ZI$Limit)
#elif __ICCARM__
#pragma section="HEAP"
#define HEAP_BEGIN (__segment_end("HEAP"))
#else
extern int __bss_end;
#define HEAP_BEGIN (&__bss_end)
#endif
这个是RT-Thread IoT例程对HEAP_BEGIN的定义。
实际仿真RT-Thread IoT例程中HEAP_BEGIN地址为0x20000FF0,rt_system_heap_init((void *)HEAP_BEGIN, (void *)HEAP_END);执行后。
在分配内存就OK了。


目前问题暂时解决了,采用了bsp\stm32\stm32l475-atk-pandora\board\linker_scripts里的三个文件覆盖了从templates里考出的文件,然后按手册更改了配置文件,更改了board.h文件。实际再下载程序,可以正常运行了,但是查看了linker_scripts里的文件,理解的还是不太一样,link.sct 定义的是ram2,RW_IRAM2 0x10000000 0x00008000 { ; RW data.ANY (+RW +ZI)。按我的理解,可以改为RAM1 RW_IRAM1 0x20000000 0x00020000。修改后rt_application_init();继续跑飞。
按照BSP教程的说明,这个地方显得比较模糊,新手还是不好容易理解如何修改配置文件。

yangjie 发表于 2019-9-11 15:19
除了根据教程中的进行设置之外,是否自己在工程中设置了什么东西


还在找问题,可能是设置了什么。和L475的例程做了对比,L475的例程直接下到板子可以正常运行,自己做的L451的串口显示version后就飞了,还是在初始任务创建后就挂了。我看重新再来一次。

WillianChan 发表于 2019-9-11 14:41
你的RAM可能是分多段的,可能有一部分是CCM DATA RAM,被你做BSP的时候囊括到整个RAM大小当中去了。做BSP的 ...


看数据手册160K的ram分了两个区,一个128k,一个32k。配置的时候只配置了128k的ram区,编译后在分配内存的时候还是报错了。

flyboy 发表于 2019-5-24 17:47
你要点击开始录制,才会启动程序啊 哇哇哇~


点击录制也没有启动,还在找原因

yangjie 发表于 2019-5-24 17:19
是添加在 SystemView 工具安装目录下的 Description 目录下了吗


是的 我把bsp下的文件复制到安装文件夹下 了

发布
问题

分享
好友