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

嵌入式开发者社区

 找回密码
 立即注册

QQ登录

只需一步,快速开始

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

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

[复制链接]

5

主题

6

帖子

51

积分

注册会员

Rank: 2

积分
51
跳转到指定楼层
楼主
发表于 2014-8-19 16:38:00 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 zc_fly 于 2014-8-19 16:53 编辑
. C* p+ i. ~9 G6 s: z
* K: y6 f3 q+ Y' G2 MOMAPL138的ARM端对共享区内存进行直接访问,代码如下所示:#include <stdio.h>) j0 [+ f# A- `$ H2 R
#include <unistd.h>; Z, J1 Y& o6 H( h* `7 d
#include <sys/mman.h>
: X/ |, L0 N* A8 r) c: k#include <sys/types.h>& i, Y7 w/ A3 d2 W( y
#include <fcntl.h>- l& u5 e' Y1 G: p1 j

! _6 `6 Z! b2 T$ c0 e#define SHAER_RAM_BASE_ADDR    (0x80000000)   - M8 N; x( i& |: H

1 z# {4 s6 h' jtypedef struct
' {% S# y- f  u% K{3 S7 M# ?. J- m% G+ a$ N
        unsigned int a;- z8 u1 Z3 C; w1 c6 Q
        unsigned int b;
$ n/ p" ^9 U' R( J( O  V1 n" g        unsigned int packet_cout;2 C0 T3 f0 v! L3 ~$ c
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
. f% _7 {7 J# a$ a! |: s. r5 R( C$ k
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM);
! ]9 J$ L5 ^# c2 Dunsigned int count_copy = 0;1 z  z( ^6 P. ]) @1 ]4 N

1 t7 D# q* E, J% j+ `/ L
) h8 k4 h$ C' v( _3 i1 p& G$ kint main()
2 f* c9 z+ Q. Q/ F* d. |. E! S) G9 x{
- V' f1 h( e8 X, ~        pRX_MSG_PROTOCOL pshreRAM = NULL;
2 u9 x6 ]; N& \! h) h1 Z6 [' N        pshreRAM = (pRX_MSG_PROTOCOL)SHAER_RAM_BASE_ADDR;- r- q5 o8 M1 Z7 J7 G) R( c4 g( A
  ~0 R8 ]! i: ]8 O* W
        while(1)
  @3 d0 h* r; j3 [5 H3 n        {5 y# O: J/ ?( V( {* {9 d, }
                read_MSG_buffer(pshreRAM);
7 f1 t) r# s4 Y- p        }               
% u2 F% n" _- N% Q- G$ j) E}
/ K7 x; A/ [! m2 `# \, q, L
* [( ~* W/ t5 i% ^void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM)
9 g  g) Z8 x8 h' \9 R) Y{
/ K6 V! t. g& x; C        RX_MSG_PROTOCOL buf;
& H4 v- B) H4 |        : m6 G+ k6 q* l
        buf.a = pshreRAM->a;
- o! i5 Q/ v& B( D$ ^) P        buf.b = pshreRAM->b;
( L& N" h6 j' U        buf.packet_cout = pshreRAM->packet_cout;8 Q# N$ M; Z) f8 D( B- H" T
        
* ]! i6 k3 _* `9 F7 `        if(buf.packet_cout != count_copy)9 B2 _7 v  D% o, s5 d. S; S4 n  f* Q
        {5 t; x5 R0 l0 J+ U+ ]% B7 r
                printf("a is %d\n", buf.a);9 }# a+ j5 a$ L) Z  {
                printf("b is %d\n", buf.b);
  G7 I* s! C' ]/ b* }1 |6 c& H3 @( l9 ]                printf("count is %d\n", buf.packet_cout);
# O, W" w. _/ O" C                count_copy = buf.packet_cout;
0 w% w2 |6 I/ C8 y) g        }. \4 B6 |7 n4 v9 n1 b
        else+ c& R: t% I6 `
        {
5 [& j' h7 ~0 N                printf("No effective message!");
% D; i/ z+ R% j+ P7 r. [' c+ W$ b        }3 Z7 A- p; N2 S- E6 ]( d5 o) Q
}8 S  l/ N+ B$ {/ c0 s. L+ c
3 U8 R6 L6 U% V6 k- I2 D" `

% o7 |8 W  j+ O# t# [2 X1 l* _但是出现segmentation fault的问题,这是什么原因啊???我在DSP端烧写了一段小程序,向共享区0x80000000位置写入数据,用CCS 测试发现写入成功。
$ k/ n  `( ]( q1 o8 s" v使用下面代码,对内存使用了mmap函数后:
3 s" s7 K& h6 O3 o#include <stdio.h>1 g6 B: Q9 X1 A1 ~( N% f
#include <unistd.h>
8 G' n' K* ?+ G9 V#include <sys/mman.h>* ~6 d4 [4 g7 U
#include <sys/types.h># o( ?, _, d  `  s& z
#include <fcntl.h>  m4 ~4 q& K2 {5 k( y
2 o' N% e/ B0 O, [% o7 M
#define SHAER_RAM_BASE_ADDR    (0x80000000)
9 g# P, o" s: ^0 |#define SHAER_RAM_SIZE         (0x20000)   / t/ i" B! P1 F
% f! S* i0 x, }* }, z
typedef struct! B1 N7 J3 f. [* S
{& f& d( U4 }: K0 y, g5 J+ w. l
        unsigned int a;* M" e( S" \# r3 j- m; E
        unsigned int b;# e' S2 R8 F5 P" [  r* d* b. K9 @
        unsigned int packet_cout;
( @8 J2 E" F& C' F2 q}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
' N9 @% I+ E1 s2 H$ q4 [
  n9 ]! J5 Q' q- Z/ }! p8 v  A0 yvoid read_MSG_buffer(int *baseaddr);
" I+ j$ u* o- F+ l  s% v# cunsigned int count_copy = 0;9 e" R2 h& a7 G3 B3 P: C+ {% I' o# a

( l0 p& l. f! ^' G8 r- Dint main()% Z' ?" \/ {+ T8 o+ K' p
{* G7 t. p: T2 t7 X9 i* |$ {
        int fd;
. R: o, H' X; K# i. ~: R8 `: z        int *mem = NULL;8 @! k9 x8 W8 S" D
- a2 t% Q% ]7 u- P. k6 V5 f
        if((fd = open("/dev/mem", O_RDWR)) <0)
7 _% C, G7 m1 r1 i  Y" V        {* `4 {8 j, u, g) u
                perror("open error");8 @" t& s+ m" S
                return -1;+ E- a2 m$ w! k" I( L+ G
        }
* _  R6 e# P4 x8 L        
8 o  x- v" L/ C& m9 x6 P        mem = mmap((void *)SHAER_RAM_BASE_ADDR, SHAER_RAM_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);2 v3 z  a  A4 o4 m! j- \! {( I# o

7 c% G% D9 A' u1 ^        while(1)
: B: ]: Z8 Y5 X& ]! k8 O9 V        {0 I4 ~/ w+ Z" p, N  u
                read_MSG_buffer(mem);
) T# u9 V  `# ^) m& T  n2 g  h        }               
: a5 T: b$ O# k  ~+ J9 c  Y2 W6 X}
) t: s+ g! S  s8 C3 Q1 o/ ~& x: w% }3 j( h( B- Q
void read_MSG_buffer(int *baseaddr)
& D8 y; `, C! X% n. V. b{
  {+ E' |1 t0 h; y3 s        pRX_MSG_PROTOCOL pshreRAM = NULL;
+ I. l, O+ m$ Z# i+ v
1 U' o$ C5 |7 A8 B' a        pshreRAM = (pRX_MSG_PROTOCOL)baseaddr;2 d/ i0 m3 V. h8 n7 Z  y
$ d/ E: Q5 Z' t
        if(pshreRAM->packet_cout != count_copy)4 v( m: {' t; v, l
        {2 B! R' U" K. C$ U
                printf("a is %d\n", pshreRAM->a);! l8 i% @+ |5 v2 n1 \: A3 L
                printf("b is %d\n", pshreRAM->b);
  i( V& ^7 t% x2 E1 e& P                printf("count is %d\n", pshreRAM->packet_cout);- H  q! d0 Z: x, I) l" a
                count_copy = pshreRAM->packet_cout;
# P4 ?& ]! ~( x) v% x) G- C) X        }
9 l- d% W# \  H& L/ b        else
0 k- S3 c5 v3 s        {" r4 W" p) R& M: h
                printf("No effective message!\n");: x6 c! y0 d0 N3 w
        }2 y! {( K0 {% r1 |) x
}+ D- L! Z1 O# v6 u0 A+ L4 X: y

$ `' R& C/ M8 F* E7 l没有出现segmentation fault这个错误,但是读出来的数据均为0。这该怎样解决啊???主要问题还是在Linux系统下,OMAPL138是否可以直接访问映射地址???该怎样实现???$ i8 F4 |# b9 `& [$ i, \8 t5 p

7 x0 E( Q0 G% u3 z" q1 J( }! h* y! _+ u( H
& |6 j" t& b2 u  `+ q9 a3 C

( s: |: m" f  b1 ^$ m( J
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖
回复

使用道具 举报

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

本版积分规则

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

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

GMT+8, 2026-1-26 23:43 , Processed in 0.044809 second(s), 26 queries .

Powered by Discuz! X3.2

© 2001-2015 Comsenz Inc.

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