OpenEdv-开源电子网

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

[XILINX] 领航者ZYNQ双核AMP实验中软件中断异常

[复制链接]

1

主题

2

帖子

0

精华

新手入门

积分
19
金钱
19
注册时间
2020-5-25
在线时间
5 小时
发表于 2022-8-19 20:14:03 | 显示全部楼层 |阅读模式
10金钱
在学习《领航者ZYNQ之嵌入式SDK开发指南_v2.0》的第十五章双核AMP实验时,软中断出现问题,对CPU0的代码稍加修改,将scanf输入freq_gear修改为freq_gear自动变化,其余代码均未修改。然后软中断没有触发,最后在XScuGic_SoftwareIntr(&Intc,SOFT_INTR_ID_TO_CPU1,CPU1_ID);前面加了延时函数,软件中断又可以触发,这是为什么呢?
修改前CPU0主函数代码:
//CPU0 main函数int main(){  //S=b1 TEX=b100 AP=b11, Domain=b1111, C=b0, B=b0  Xil_SetTlbAttributes(SHARE_BASE,0x14de2);    //禁用OCM的Cache属性  //启动CPU1  start_cpu1();  //CPU0中断初始化  cpu0_intr_init(&Intc);  while(1){      if(rec_freq_flag == 0){          xil_printf("This is CPU0,Please input the numbers 1~5 to change breath led frequency\r\n");          scanf("%d",&freq_gear);          if(freq_gear >= 1 && freq_gear <=5){              xil_printf("You input number is %d\r\n",freq_gear);              //向共享的地址中写入输入的数据              Xil_Out8(SHARE_BASE,freq_gear);              //给CPU1触发中断              XScuGic_SoftwareIntr(&Intc,SOFT_INTR_ID_TO_CPU1,CPU1_ID);              rec_freq_flag = 1;          }else{              xil_printf("Error,The number range is 1~5\r\n");              xil_printf("\r\n");          }      }  }  return 0 ;}
修改后CPU0主函数代码:




int main()
{  //S=b1 TEX=b100 AP=b11, Domain=b1111, C=b0, B=b0  Xil_SetTlbAttributes(SHARE_BASE,0x14de2);    //禁用OCM的Cache属性  //启动CPU1  start_cpu1();  //CPU0中断初始化  cpu0_intr_init(&Intc);  freq_gear = 1;  while(1){      if(rec_freq_flag == 0){  //        xil_printf("This is CPU0,Please input the numbers 1~5 to change breath led frequency\r\n");          if(freq_gear >= 1 && freq_gear <=5){                            xil_printf("You input number is %d\r\n",freq_gear);              //向共享的地址中写入输入的数据              Xil_Out8(SHARE_BASE,freq_gear);              //给CPU1触发中断              XScuGic_SoftwareIntr(&Intc,SOFT_INTR_ID_TO_CPU1,CPU1_ID);              rec_freq_flag = 1;                            freq_gear ++;              if(freq_gear>5){                  freq_gear = 1;              }          }else{              xil_printf("Error,The number range is 1~5\r\n");              xil_printf("\r\n");          }      }  }  return 0 ;}
































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

使用道具 举报

1

主题

2

帖子

0

精华

新手入门

积分
19
金钱
19
注册时间
2020-5-25
在线时间
5 小时
 楼主| 发表于 2022-8-19 20:16:06 | 显示全部楼层
本帖最后由 song0822 于 2022-8-19 20:18 编辑

CPU0修改前的代码
//CPU0 main函数

int main()

{
  //S=b1 TEX=b100 AP=b11, Domain=b1111, C=b0, B=b0
  Xil_SetTlbAttributes(SHARE_BASE,0x14de2);    //禁用OCM的Cache属性
  //启动CPU1
  start_cpu1();
  //CPU0中断初始化
  cpu0_intr_init(&Intc);
  while(1){

      if(rec_freq_flag == 0){

          xil_printf("This is CPU0,Please input the numbers 1~5 to change breath led frequency\r\n");

          scanf("%d",&freq_gear);

          if(freq_gear >= 1 && freq_gear <=5){

              xil_printf("You input number is %d\r\n",freq_gear);

              //向共享的地址中写入输入的数据

              Xil_Out8(SHARE_BASE,freq_gear);

              //给CPU1触发中断

              XScuGic_SoftwareIntr(&Intc,SOFT_INTR_ID_TO_CPU1,CPU1_ID);

              rec_freq_flag = 1;

          }

          else{

              xil_printf("Error,The number range is 1~5\r\n");

              xil_printf("\r\n");

          }

      }

  }

  return 0 ;

}

CPU0修改后的代码


int main()
{
  //S=b1 TEX=b100 AP=b11, Domain=b1111, C=b0, B=b0
  Xil_SetTlbAttributes(SHARE_BASE,0x14de2);    //禁用OCM的Cache属性
  //启动CPU1
  start_cpu1();
  //CPU0中断初始化
  cpu0_intr_init(&Intc);
  freq_gear = 1;
  while(1){

      if(rec_freq_flag == 0){
  //        xil_printf("This is CPU0,Please input the numbers 1~5 to change breath led frequency\r\n");
          if(freq_gear >= 1 && freq_gear <=5){
                          
              xil_printf("You input number is %d\r\n",freq_gear);
              //向共享的地址中写入输入的数据
              Xil_Out8(SHARE_BASE,freq_gear);

              //给CPU1触发中断
              XScuGic_SoftwareIntr(&Intc,SOFT_INTR_ID_TO_CPU1,CPU1_ID);

              rec_freq_flag = 1;
                          
                          freq_gear ++;
                          if(freq_gear>5){
                                  freq_gear = 1;
                          }

          }else{
              xil_printf("Error,The number range is 1~5\r\n");
              xil_printf("\r\n");

          }

      }

  }

  return 0 ;

}





回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165186
金钱
165186
注册时间
2010-12-1
在线时间
2106 小时
发表于 2022-8-24 00:18:58 | 显示全部楼层
帮顶
回复

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2024-10-4 02:35

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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