news 2026/6/7 19:09:49

JL — AC695X — SDK启动流程程序调试方法

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
JL — AC695X — SDK启动流程程序调试方法

JL-695X-SDK 具体的启动流程就不一一说了,已经很熟悉了,这里挑一些重点记录一下,以防后面再重新来写JL的时候一头雾水


一、启动流程

上电肯定是先从main函数开始执行,JL-695X-SDK(后面都用SDK代替)的main函数在:init.c内,重点关注这一句:

task_create(app_task_handler,NULL,"app_core");

会创建app_task_handler这一个进程,然后进入app_main函数


app_main函数内,重点关注这一句:

app_curr_task=APP_POWERON_TASK;

app_curr_task变量是非常重要的一个变量,此变量在SDK中所有的模式切换中都会使用到

这一句作用就是:设置下一个模式为开机模式APP_POWERON_TASK

app_main函数的最后,会进入模式处理函数app_task_loop,之后SDK就会一直在模式处理函数之中运行


那我们可以很清楚的看到,app_task_loop()是一个向量机的形式,switch里面的变量就是我们上面说的app_curr_task

因为我们之前设置了app_curr_task = APP_POWERON_TASK;,所以,这里会进入case APP_POWERON_TASK:,从而进入app_poweron_task();

switch(app_curr_task){caseAPP_POWERON_TASK:log_info("APP_POWERON_TASK \n");app_poweron_task();break;

进入之后,会进行UI显示,之后是提示音的播放,在提示音播放结束之后,会执行对应的回调函数,从而进行初始化

tone_play_with_callback_by_name即提示音播放函数,内部含回调函数tone_play_end_callback

//===================== app_poweron_task() =====================interr=tone_play_with_callback_by_name(tone_table[IDEX_TONE_POWER_ON],1,tone_play_end_callback,(void*)IDEX_TONE_POWER_ON);/* if (err) { //提示音没有,播放失败,直接init流程 *//* power_on_init(); *//* } */while(1){app_task_get_msg(msg,ARRAY_SIZE(msg),1);switch(msg[0]){caseAPP_MSG_SYS_EVENT:if(poweron_sys_event_handler((structsys_event*)(msg+1))==false){app_default_event_deal((structsys_event*)(&msg[1]));//由common统一处理}break;default:break;}if(app_task_exitting()){power_on_unint();return;}}
staticvoidtone_play_end_callback(void*priv,intflag){intindex=(int)priv;if(APP_POWERON_TASK!=app_get_curr_task()){log_error("tone callback task out \n");return;}switch(index){caseIDEX_TONE_POWER_ON:power_on_init();break;}}

power_on_init():初始化定义函数

请注意:这里的初始化函数运行,是在播放完毕提示音之后的(因为这个函数是提示音播放函数的回调),所以,这里面的定义,只有等到提示音播放完,才会开始运行。

staticintpower_on_init(void){///有些需要在开机提示完成之后再初始化的东西, 可以在这里初始化#ifDEMO_GPIO_LED_ENABLELED_DEMO();#endif#ifDEMO_PWM_LED_ENABLEexternvoidtimer_pwm_test(void);timer_pwm_test();#endif#ifDEMO_SYSTIMER_ENABLEexternvoidSystimer_demo_init();

当然,如果你需要在刚刚上电,就进行初始化,比如初始化一些GPIO等等…可以在板级配置文件文件夹下面的.c文件中的board_init()函数中进行编写

这里的定义会在上电时进行,因为board_init()app_task_handler()中的的app_init()被调用,在app_main()函数之前

board_ac695x_demo.c —— Line952

继续在power_on_init()函数里面进行,当执行完毕初始化之后,会进入下一个模式的选择,这个可以自己定义,如果想要下一个模式进入蓝牙模式,这里可以写app_task_switch_to(APP_BT_TASK);

app_task_switch_to(APP_BT_TASK);

其中,app_task_switch_to()核心逻辑为修改下面两个参数(而不是直接修改app_curr_task

//app_task为传入的参数app_prev_task=app_curr_task;//记录当前的模式为上一个模式app_next_task=app_task;//将下一个模式记录为传入的参数

因为app_next_task在这里被app_task_switch_to(APP_BT_TASK)修改为APP_BT_TASK

所以会被模式中的退出检测函数捕捉到

u8app_task_exitting()//{structsys_eventclear_key_event={.type=SYS_KEY_EVENT,.arg=(void*)DEVICE_EVENT_FROM_KEY};if(app_next_task!=0){app_curr_task=app_next_task;app_next_task=0;sys_key_event_disable();sys_event_clear(&clear_key_event);return1;}return0;}

其中,里面的if (app_next_task != 0) {,就是退出条件,而我们已经在上面把app_next_task换成了APP_BT_TASK,所以这里才会修改app_curr_task,然后清空app_next_task,避免进入下一个模式错误退出。

这样,函数就回退到了app_loop_task(),后面的运行中,会根据app_next_task进入CASE APP_BT_TASK,从而开始蓝牙模式

至此,SDK启动完成,正式开始运行



二、程序调试方式

JL芯片和其他的MCU不太一样,他不能够使用常规的仿真调试方法去进行调试,只能够通过设置UART打印日志的方式进行调试

打印总开关位置:app_config.hLine —— 17,如果想要关闭打印,注释掉这个东西就可以了

#defineCONFIG_DEBUG_ENABLE

打印总开关开启之后,回到板级配置文件中,配置好对应参数

主要是串口的脚位以及波特率,因为只是打印输出,所以接收的脚位也可以不配置

#defineTCFG_UART0_ENABLE1//ENABLE_THIS_MOUDLE //串口打印模块使能#defineTCFG_UART0_RX_PORTNO_CONFIG_PORT//串口接收脚配置(用于打印可以选择NO_CONFIG_PORT)#defineTCFG_UART0_TX_PORTIO_PORTA_12//串口发送脚配置#defineTCFG_UART0_BAUDRATE1000000//串口波特率配置

然后配置好外部硬件连接,完成

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/6/7 11:42:17

22、Docker Swarm 模式:从基础到实践

Docker Swarm 模式:从基础到实践 1. 基础部署与应用上线 在容器部署中,我们可以借助相关工具实现应用的快速上线。例如,Centurion 可以完成拉取所需镜像、验证镜像拉取是否正确,接着连接到主机停止旧容器、创建新容器并启动,还会持续进行健康检查,直到容器报告健康状态…

作者头像 李华
网站建设 2026/6/2 14:18:09

24、容器编排:从 ECS 到 Kubernetes 的实践指南

容器编排:从 ECS 到 Kubernetes 的实践指南 1. ECS 任务清理与进阶准备 在使用 AWS ECS(Elastic Container Service)时,当你使用相同的任务 ID 再次描述任务,你会发现 lastStatus 键被设置为 STOPPED 。例如: $ aws ecs describe-tasks --cluster fargate-testin…

作者头像 李华
网站建设 2026/6/7 7:14:08

26、Docker高级技术深度解析

Docker高级技术深度解析 1. Kubernetes与Docker生态 Kubernetes是一个庞大的系统,社区参与度极高。它与Docker生态系统有很大的重叠部分,同时也发展出了许多自己的组件。Docker与Kubernetes之间的集成日益增强。之前我们通过Minikube让大家初步了解了相关内容,但如果你感兴…

作者头像 李华
网站建设 2026/6/5 23:43:54

29、Docker 高级配置与架构解析

Docker 高级配置与架构解析 1. Docker 网络配置 在 Docker 中,可以进行多种网络配置,基本的网络配置相对简单。例如,创建一个 macvlan 网络: $ docker network create -d macvlan \--subnet=172.16.16.0/24 \--gateway=172.16.16.1 \-o parent=eth0 ourvlan还可以通…

作者头像 李华
网站建设 2026/6/7 2:38:19

30、Docker高级特性与容器平台设计全解析

Docker高级特性与容器平台设计全解析 1. 探索runc与容器统计信息 在容器技术领域,runc是一个重要的组件。通过查看文件列表,我们能发现一些与容器配置和运行相关的文件,例如 config.json 文件,它类似于 docker inspect 的详细输出,不过由于其内容较多,这里不做展示…

作者头像 李华
网站建设 2026/6/2 2:49:08

从机房打杂到月入 5W:5 年底层打工人转行安全,说点掏心窝的实话

01、机房狗的血泪史 老子干了五年运维,从IDC到云平台,从搬服务器到舔K8s,最后发现——这行就是他妈的高级电工! 前两年在野鸡IDC: 每天重启服务器300次换硬盘比换女朋友还勤快最牛逼的技术是能用网线抽蟑螂 后来跳…

作者头像 李华