OMAPL138的内存映射是否在Linux下已经完成??? - OMAP-L138 - 嵌入式开发者社区 - 51ele.net
设为首页收藏本站
点击跳转“创龙科技服务通”

嵌入式开发者社区

 找回密码
 立即注册

QQ登录

只需一步,快速开始

查看: 5540|回复: 0
打印 上一主题 下一主题

OMAPL138的内存映射是否在Linux下已经完成???

[复制链接]

5

主题

6

帖子

51

积分

注册会员

Rank: 2

积分
51
跳转到指定楼层
楼主
发表于 2014-8-19 16:38:00 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 zc_fly 于 2014-8-19 16:53 编辑
/ Z( j/ L* \  l6 V2 y: t- k2 H5 r7 c6 }
OMAPL138的ARM端对共享区内存进行直接访问,代码如下所示:#include <stdio.h>. E$ E; N$ H+ N# O+ \; v2 G
#include <unistd.h>5 _* d' a! N& K$ f. }6 A( j
#include <sys/mman.h>
$ R' \/ U$ p. P1 O# N8 [#include <sys/types.h>
6 P5 A9 h0 }# a) t( ]9 x) F9 t#include <fcntl.h>
  A! y5 g+ d3 w& R9 `; V
& F$ |0 N) ^& W. d) c; }#define SHAER_RAM_BASE_ADDR    (0x80000000)   $ S: L2 B* d% {) o" A

0 H1 e# @5 ^  jtypedef struct+ F! ]% ^3 i! R, w2 D! r
{
) u7 {3 q5 E2 x5 _0 x' G        unsigned int a;
- G- x# L2 J% p+ B3 A3 V        unsigned int b;7 r! z% E' n( a
        unsigned int packet_cout;( O1 v1 r% z/ e5 i- k# p; b# m
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
) I5 `& }5 j3 T" i" v' J  p
5 p& c! g# ^; o/ zvoid read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM);
9 s0 m$ H# F& S/ ~2 _unsigned int count_copy = 0;
, g" O. \1 L; m) y
6 {: N* @0 G# f' ?5 Q
3 \! d1 s* o6 _int main()
' W: T4 Y: ?8 L{8 S3 p1 M# Z1 r/ a4 ]( C( j
        pRX_MSG_PROTOCOL pshreRAM = NULL;6 N! m% |8 a, w4 n5 Q2 J( i/ B
        pshreRAM = (pRX_MSG_PROTOCOL)SHAER_RAM_BASE_ADDR;
( H* Z, b) N  ?
: H  Z7 }/ H% i2 T, C6 g- x  g: F7 t        while(1)
* z3 R+ N8 P, _* j1 g( ^0 ~' e        {- N7 J- U' ^. x
                read_MSG_buffer(pshreRAM);; h" _* O% D5 O
        }                7 Z, P3 N$ ]  F% ]3 H) c  R4 G
}
4 N9 t: h& c( u) K% D3 J  m
/ v( X7 E' k! L+ o+ ]+ M2 u) K& qvoid read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM)
' k4 i- C. l' P- Y{
+ e+ R: l3 X8 I" A/ _        RX_MSG_PROTOCOL buf;$ R6 S1 P  W! u' r
        
, W, c+ P0 }/ c* t6 S5 M# I        buf.a = pshreRAM->a;8 u8 H2 u0 n4 x$ z
        buf.b = pshreRAM->b;% U  h% v' [. F3 Q
        buf.packet_cout = pshreRAM->packet_cout;
$ E7 q7 v2 W' `        , y+ D; p4 S9 F7 \/ F  p% C
        if(buf.packet_cout != count_copy)$ i3 u: \  ^' d8 d0 _% L
        {' @4 Y; A/ E4 c; x! s/ c
                printf("a is %d\n", buf.a);
( q( l+ i' L7 X                printf("b is %d\n", buf.b);1 Z8 m5 H& }& a; N, O% r. J: P% z" N
                printf("count is %d\n", buf.packet_cout);
" h2 y9 Z- e! E) f                count_copy = buf.packet_cout;. |9 i/ ]" K$ P2 |9 Y
        }8 R: ?& x( Q# L; F
        else
1 o7 g3 p) T5 r- ?3 o# F1 e8 p7 A! {& i        {
# ]+ F& u4 [# l( I7 o                printf("No effective message!");7 A! C3 m  k8 a1 N  a3 b
        }
, ?& g% N" b0 p. W4 d3 u0 r  b5 Z; c}) Y0 J2 h8 `% U& P; y4 v
( r% z  L& U/ k) L
5 g. u! a8 E) w# M9 }3 v7 L5 d
但是出现segmentation fault的问题,这是什么原因啊???我在DSP端烧写了一段小程序,向共享区0x80000000位置写入数据,用CCS 测试发现写入成功。# u$ `6 _9 P7 K8 l, L2 A
使用下面代码,对内存使用了mmap函数后:
  H& h8 @/ u- K#include <stdio.h>) D, D$ h0 [: x7 R- @. x: r
#include <unistd.h>
6 O/ w7 Q) u+ @" c5 q" K2 }0 \#include <sys/mman.h>1 s0 ~* {, Q& i9 S* C8 n) e1 ?6 I
#include <sys/types.h>, a2 _: p+ s8 L
#include <fcntl.h>4 s/ B3 N5 w5 N8 G7 q+ ?* J

' j0 J/ Y/ X/ p8 J& g' g#define SHAER_RAM_BASE_ADDR    (0x80000000)
* q5 c" h) V7 R#define SHAER_RAM_SIZE         (0x20000)   
$ {& D2 X  d" T# L, T0 T- u& g+ \# B3 t5 f& t
typedef struct" K" }  A& H  K+ I
{" l" v8 t7 E$ c: M4 b$ W% c
        unsigned int a;& j7 k) d! b2 i. g0 _; d& L3 b" a* G
        unsigned int b;0 I+ r# ^1 Y2 ^- f- k
        unsigned int packet_cout;! ^& m6 \; }9 x
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
& `  n5 R! e1 X2 [- W- t
4 d3 F2 W& T; m2 ~/ ~void read_MSG_buffer(int *baseaddr);
( v, n( P" l- I5 n4 Lunsigned int count_copy = 0;
, g% i: {& Z+ m0 c4 K( s0 @0 b1 ?: E
6 I# X' r! J$ X8 U6 i9 ~3 ?6 J6 ^6 W! eint main()- F% m% P9 U3 _: D3 W! l# P
{
. A( ^" F. O/ W6 c- O4 ?. c0 a/ v        int fd;
! e$ v$ g: h! Q0 R& O        int *mem = NULL;  o- P+ f3 g$ x" c3 Y% c
5 }+ |/ q3 o3 u# p. d0 Q
        if((fd = open("/dev/mem", O_RDWR)) <0)
% M4 H, W: S5 t- c  v" t  p        {
$ g* j3 K7 R5 Q" i3 M; ?% |$ |                perror("open error");
* ~+ |" [' B" e4 Q8 B                return -1;  z5 F% n5 N$ N- T. E
        }, e3 g" v# ^; m/ j) f& g  L
        
5 q" X7 U; ]) D2 {        mem = mmap((void *)SHAER_RAM_BASE_ADDR, SHAER_RAM_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);8 g1 E5 r. b* _
+ I! ?5 ?& z9 U: R& C7 }
        while(1)
! e# _1 `$ f2 v% x        {% h# b' Y9 n- ^/ m  ?, d& {
                read_MSG_buffer(mem);
" T8 C  X7 U0 A& F' j3 Q2 D        }               
1 e8 E: h0 t; @" W+ e- L}
" b6 a& e+ C+ M. P! F& G: w$ ]. ]7 V- _) v$ ^2 }. q4 T1 \7 V* v
void read_MSG_buffer(int *baseaddr)# J; n9 T9 m3 Q# O& k  A
{8 x& s2 }" n6 _/ U" \" t3 c
        pRX_MSG_PROTOCOL pshreRAM = NULL;
& |5 c8 r" Z8 [. r. l
+ _- h3 Z' I  w5 \1 }        pshreRAM = (pRX_MSG_PROTOCOL)baseaddr;
1 v" J8 R/ R7 F& y- I5 g6 N! ?% c
6 k; x" c. m4 v0 r$ \0 T        if(pshreRAM->packet_cout != count_copy)
. R) `2 E1 w' R2 l- V  w        {
4 O6 I1 j$ m- Y7 w( x4 c+ j+ r. c                printf("a is %d\n", pshreRAM->a);
  q4 k; P1 h2 e                printf("b is %d\n", pshreRAM->b);7 z+ G& f! u5 Y1 \; r
                printf("count is %d\n", pshreRAM->packet_cout);
. Y9 G3 z9 S% Q) P0 J+ x/ V# M! ~0 Z& }                count_copy = pshreRAM->packet_cout;. _2 C2 y$ c# J: I1 M, K0 t
        }( J3 x/ ^; ]% e" x5 \" I3 e" P& t, v+ c
        else2 q  n! E; t) i: X6 M: l
        {5 D9 d& w, z& A5 a$ a' J7 b% k
                printf("No effective message!\n");; G# }8 [/ |6 y: _: y/ C0 f
        }. `6 L7 x/ t. s" _
}7 d: G, A, J( V
. n* S9 _" P; `2 P$ O7 `( d
没有出现segmentation fault这个错误,但是读出来的数据均为0。这该怎样解决啊???主要问题还是在Linux系统下,OMAPL138是否可以直接访问映射地址???该怎样实现???" m* @5 n! Y' `9 f3 q; J

$ L2 I' v  ~; N! N4 F1 i( ?2 L5 ?9 ^" V
( K- I% e$ j. r- H5 t/ [
, a. m2 Q/ F4 X' a8 O  Y
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖
回复

使用道具 举报

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

本版积分规则

点击跳转“创龙科技服务通”

QQ|手机版|小黑屋|嵌入式开发者社区 ( 粤ICP备15055271号

GMT+8, 2026-1-26 16:36 , Processed in 0.038529 second(s), 26 queries .

Powered by Discuz! X3.2

© 2001-2015 Comsenz Inc.

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