OpenEdv-开源电子网

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

407+uCOSIII+STL<map>可以工作吗?

[复制链接]

4

主题

17

帖子

0

精华

初级会员

Rank: 2

积分
162
金钱
162
注册时间
2017-3-6
在线时间
22 小时
发表于 2017-11-4 11:28:08 | 显示全部楼层 |阅读模式
1金钱
407VE+原子哥的407开发板例程中的uCOSIII模版,LED能正常闪烁。如果添加了STL库的map(下面这两句),就不能正常工作了。直接运行时led不闪烁。debug模式下无法进入main函数。请问是怎么回事啊?#include <map>
std::map<int, int> g_tskMap1;
main.cpp如下:

#include "sys.h"
#include "delay.h"
#include "includes.h"
#include "os_app_hooks.h"
#include "led.h"
#include "os_cfg_app.h"

//ALIENTEK 探索者STM32F407开发板 UCOSIII实验
//例4-1 UCOSIII UCOSIII移植

//UCOSIII中以下优先级用户程序不能使用,ALIENTEK
//将这些优先级分配给了UCOSIII的5个系统内部任务
//优先级0:中断服务服务管理任务 OS_IntQTask()
//优先级1:时钟节拍任务 OS_TickTask()
//优先级2:定时任务 OS_TmrTask()
//优先级OS_CFG_PRIO_MAX-2:统计任务 OS_StatTask()
//优先级OS_CFG_PRIO_MAX-1:空闲任务 OS_IdleTask()
//技术支持:www.openedv.com
//淘宝店铺:http://eboard.taobao.com  
//广州市星翼电子科技有限公司  
//作者:正点原子 @ALIENTEK

void led0_task(void *p_arg)
{
        OS_ERR err;
        p_arg = p_arg;
        while(1)
        {
                LED0=0;
                OSTimeDlyHMSM(0,0,0,200,OS_OPT_TIME_HMSM_STRICT,&err); //延时200ms
                LED0=1;
                OSTimeDlyHMSM(0,0,0,500,OS_OPT_TIME_HMSM_STRICT,&err); //延时500ms
        }
}

//任务优先级
#define START_TASK_PRIO                3
//任务堆栈大小       
#define START_STK_SIZE                 128
//任务控制块
OS_TCB StartTaskTCB;
//任务堆栈       
CPU_STK START_TASK_STK[START_STK_SIZE];
//任务函数
void start_task(void *p_arg);
//任务优先级
#define LED0_TASK_PRIO                4
//任务堆栈大小       
#define LED0_STK_SIZE                 128
//任务控制块
OS_TCB Led0TaskTCB;
//任务堆栈       
CPU_STK LED0_TASK_STK[LED0_STK_SIZE];
void led0_task(void *p_arg);
#include <map>
std::map<int, int> g_tskMap1;

int main(void)
{
        OS_ERR err;
        CPU_SR_ALLOC();
       
        delay_init(168);          //时钟初始化
        NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);//中断分组配置
    LED_Init();
       
        OSInit(&err);                //初始化UCOSIII
        OS_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_ERR         * )&err);                                //存放该函数错误时的返回值

        OS_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

#if        OS_CFG_SCHED_ROUND_ROBIN_EN  //当使用时间片轮转的时候
         //使能时间片轮转调度功能,时间片长度为1个系统时钟节拍,既1*5=5ms
        OSSchedRoundRobinCfg(DEF_ENABLED,1,&err);  
#endif               
       
        OS_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_ERR         * )&err);
                 OS_TaskSuspend((OS_TCB*)&StartTaskTCB,&err);                //挂起开始任务                         
        OS_CRITICAL_EXIT();        //退出临界区
}


正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

4

主题

17

帖子

0

精华

初级会员

Rank: 2

积分
162
金钱
162
注册时间
2017-3-6
在线时间
22 小时
 楼主| 发表于 2017-11-4 14:27:43 | 显示全部楼层
本帖最后由 growthring 于 2017-11-4 15:09 编辑

再做了几个试验,vector、deque和stack这三种,声明了变量后,debug可以直接跳进main函数,运行后正常闪灯。vector,deque刷程序进芯片,按复位键能正常运行闪灯,stack不能正常运行闪灯(灯一直不亮)。
queue、list这两种声明了变量后,debug会停在LDR R0, =SystemInit,连按几次F5后,能进入main函数并正常闪灯;刷程序进芯片,按复位键开始运行,则不能正常运行闪灯(灯一直不亮)。
map,声明了变量后,debug停在LDR R0, =SystemInit,按几十次F5,就是不进main函数,不知道在哪里跑飞了。刷程序进芯片,按复位键开始运行,则不能正常运行闪灯(灯一直不亮)。有哪位知道是什么情况,要怎么做才能正常使用STL么?

回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165353
金钱
165353
注册时间
2010-12-1
在线时间
2108 小时
发表于 2017-11-6 01:12:20 | 显示全部楼层
帮顶
回复

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2024-11-27 01:38

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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