OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 3555|回复: 5

求助:F407 的板子 自己添加线程就卡死在systeminit

[复制链接]

2

主题

6

帖子

0

精华

初级会员

Rank: 2

积分
60
金钱
60
注册时间
2018-8-7
在线时间
8 小时
发表于 2018-10-25 20:58:15 | 显示全部楼层 |阅读模式
10金钱
根据rtt官网上的教程一步步来,建立了一个 工程 模板,但是里面很多组件都不大会用,然后自己也写了一些相关驱动(PWM IIC SDIO )然后我就想能不能裁剪 rtt内核 变成 类于 UCOS 的样子 外围的东西就用我自己的代码来。然后系统配置里 ,留下了Usart1 做finsh 的输出,一个 小型动态内存管理,其他的都裁剪掉了 什么都不加,编译成功,烧写成功,正常运行,添加一个没有IO的线程,每500ms打印到串口1 。编译成功,烧写成功,正常运行。添加一个 每500ms 亮灭LED 的线程进去,编译成功,烧写成功,debug单步调试,卡死在R0=systeminit; systeminit都进不去。不知道什么原因,求大神指教!多谢多谢!
下面是代码:
[mw_shl_code=c,true]/*
* File      : application.c
* This file is part of RT-Thread RTOS
* COPYRIGHT (C) 2006, RT-Thread Development Team
*
* The license and distribution terms for this file may be
* found in the file LICENSE in this distribution or at
* http://www.rt-thread.org/license/LICENSE
*
* Change Logs:
* Date           Author       Notes
* 2009-01-05     Bernard      the first version
* 2014-04-27     Bernard      make code cleanup.
*/

#include <board.h>
#include <rtthread.h>

#ifdef RT_USING_LWIP
#include <lwip/sys.h>
#include <lwip/api.h>
#include <netif/ethernetif.h>
#include "stm32f4xx_eth.h"
#endif

#ifdef RT_USING_FINSH
#include <shell.h>
#include <finsh.h>
#endif

#ifdef RT_USING_GDB
#include <gdb_stub.h>
#endif

//-------------------------//
#include "AllHeadFile.h"
//-------------------------//

//-----------------------------------------//


void rt_thread_LED_entry(void* arg)
{
        Kim_GPIO_init_out(GPIOA,GPIO_Pin_6,1);//PA6 初始化 输出 默认为 高
        while(1)
        {
                LED1 = ~LED1;
                rt_thread_delay(70);
        }
}

void rt_thread_KEY_entry(void* arg)
{
        u8 keyvalue =0 ;
        Key_init();
        while(1)
        {
                keyvalue = Key_Scan(KEY_SCAN_ONCE);
                switch(keyvalue)
                {
                        case (KEY1) : rt_kprintf("key 1 pressed \n"); break;
                        case (KEY2) : rt_kprintf("key 2 pressed \n"); break;
                        case (KEY0) : rt_kprintf("keyUP pressed \n"); break;
                        default: break;
                }               
                rt_thread_delay(2);
               
        }
}



//-----------------------------------//



void rt_init_thread_entry(void* parameter)
{

    /* initialization RT-Thread Components */
    rt_components_init();
        rt_kprintf("init thread entry\n");

       
    /* GDB STUB */
#ifdef RT_USING_GDB
    gdb_set_device("uart6");
    gdb_start();
#endif
}

void task_test(void* arg)
{
        while(1)
        {
                rt_kprintf("task runing\n");
                rt_thread_delay(55);
        }
}


int rt_application_init()
{
    rt_thread_t tid;
        rt_thread_t led;
        rt_thread_t test;
       
    tid = rt_thread_create("init",
        rt_init_thread_entry, RT_NULL,
        2048, RT_THREAD_PRIORITY_MAX/3, 20);

    if (tid != RT_NULL)
        {
                rt_kprintf("startup rt init thread \n");
                rt_thread_startup(tid);
               
        }
       
       
        led = rt_thread_create("led",rt_thread_LED_entry,RT_NULL,256,RT_THREAD_PRIORITY_MAX/3+2,10);
        if (led != RT_NULL)
        {
                rt_kprintf("led thread up\n");
                rt_thread_startup(led);
               
        }   
       
       
        test = rt_thread_create("led",task_test,RT_NULL,256,RT_THREAD_PRIORITY_MAX/3+1,10);
        if (test != RT_NULL)
        {
                rt_kprintf("led thread up\n");
                rt_thread_startup(test);
               
        }  
    return 0;
}[/mw_shl_code]
7.jpg

最佳答案

查看完整内容[请看2#楼]

问题解决了 因为 在自己定义的 函数 Kim_GPIO_init_out 中 出现了printf 函数的调用,但是因为我线程输出打印的 串口就是 Usart1 于是就取消了 fout 这个函数的实现,进不去systeminit的原因:库函数引用错误导致, 破案; DEBUG过程:既然创建普通进程可以那么创建进程就OK 那么就是我涉及到初始化硬件的地方有问题,那么我就把我初始化的句子先全部注释,不写函数,直接到application 里面初始化(GPIO_initTypeDef ) ...
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

2

主题

6

帖子

0

精华

初级会员

Rank: 2

积分
60
金钱
60
注册时间
2018-8-7
在线时间
8 小时
 楼主| 发表于 2018-10-25 20:58:16 | 显示全部楼层
问题解决了 因为 在自己定义的 函数 Kim_GPIO_init_out 中 出现了printf 函数的调用,但是因为我线程输出打印的 串口就是 Usart1 于是就取消了 fout 这个函数的实现,进不去systeminit的原因:库函数引用错误导致,



破案;

DEBUG过程:既然创建普通进程可以那么创建进程就OK 那么就是我涉及到初始化硬件的地方有问题,那么我就把我初始化的句子先全部注释,不写函数,直接到application 里面初始化(GPIO_initTypeDef ) 发现初始化成功,
回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165309
金钱
165309
注册时间
2010-12-1
在线时间
2108 小时
发表于 2018-10-26 01:35:36 | 显示全部楼层
帮顶
回复

使用道具 举报

2

主题

6

帖子

0

精华

初级会员

Rank: 2

积分
60
金钱
60
注册时间
2018-8-7
在线时间
8 小时
 楼主| 发表于 2018-10-26 13:57:31 | 显示全部楼层
Kimalittlestar 发表于 2018-10-26 13:51
问题解决了 因为 在自己定义的 函数 Kim_GPIO_init_out 中 出现了printf 函数的调用,但是因为我线程输出打 ...

接下来,我怀疑是不是时钟使能出现了问题(只有那里不一样),我的时钟使能是 我自己写的,给出 外设地址,自动使能相关时钟(eg 传参GPIOB 自动使能RCC_AHB1perich_GPIOB)然后把使能时钟函数注释,换成库函数里只使能GPIOA,编译烧录通过。那么我把问题缩小到里面去,一看到里面有一个printf 立马就反应过来了。然后我开始想怎么解决。

解决方法就是 在 #include “stdio.h” 的地方加一个宏定义,如果是使用 RTTreated,那就
#include "rtthread.h"
#define printf(ftm,...) rt_kprintf((ftm),##__VA_ARGS__)
好像是要勾选 c99mode 要不然会报错。
然后解决。多谢原子哥给我顶帖
回复

使用道具 举报

2

主题

6

帖子

0

精华

初级会员

Rank: 2

积分
60
金钱
60
注册时间
2018-8-7
在线时间
8 小时
 楼主| 发表于 2018-10-28 15:27:02 | 显示全部楼层
RTT论坛上有 人指点,config 配置开启 libc (library of C)就可以支持 printf malloc 等函数的实现。在 rtthread components ->POSIX layer and C standard library 使能里面的 libc 就可以了(未测试)
回复

使用道具 举报

27

主题

427

帖子

1

精华

论坛元老

Rank: 8Rank: 8

积分
4355
金钱
4355
注册时间
2017-5-30
在线时间
577 小时
发表于 2018-11-22 08:50:56 | 显示全部楼层
还有分析过程,赞一个
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2024-11-22 17:25

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

快速回复 返回顶部 返回列表