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

嵌入式开发者社区

 找回密码
 立即注册

QQ登录

只需一步,快速开始

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

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

[复制链接]

5

主题

6

帖子

51

积分

注册会员

Rank: 2

积分
51
跳转到指定楼层
楼主
发表于 2014-8-19 16:38:00 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 zc_fly 于 2014-8-19 16:53 编辑   |+ o+ ^) b+ @/ W" n3 ^
+ n3 r: B" f9 ^" T
OMAPL138的ARM端对共享区内存进行直接访问,代码如下所示:#include <stdio.h>
% B7 n+ j: x' ]% a3 P8 s+ f#include <unistd.h>
& Y& r$ ]# j1 I* n0 C9 X+ g! u#include <sys/mman.h>
8 i8 ~, Q+ d7 x0 n) p/ j#include <sys/types.h>7 r1 G1 _# T, a+ K5 u% `
#include <fcntl.h>. ?+ \$ Q+ Y. b. M

" \- E, _6 g, t6 X: p8 [#define SHAER_RAM_BASE_ADDR    (0x80000000)   
6 X" R$ [: m4 d7 O2 `+ r0 L0 n$ U. ?. V/ }. m6 {
typedef struct
+ S' r3 u  v( J4 X" o# _. u{, T  }  u, N' T
        unsigned int a;
  E+ K+ v$ D" j2 t! ^        unsigned int b;
) x4 k; [. K0 i9 ^( i# c5 N        unsigned int packet_cout;
- B# O9 j% n9 Y# f: U}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
: i4 Q' X/ S" G  L2 E6 m/ L  X, J* a- [4 ]1 f
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM);
5 A$ `* L% i" U4 `unsigned int count_copy = 0;
2 e( {  `. N: U, z; Y# r6 h: B5 n( r- g- f' x5 n+ ]1 l

9 [  p8 M! W0 _8 H# sint main()1 c. C  C( O2 M& s7 v  |8 r0 q  M2 I
{* y$ m! I2 Z: O, y7 J7 j
        pRX_MSG_PROTOCOL pshreRAM = NULL;  S: j. ?8 p1 H
        pshreRAM = (pRX_MSG_PROTOCOL)SHAER_RAM_BASE_ADDR;
  k" i: ?& g+ m5 e
( ?4 x8 o2 a: H0 M4 q+ b2 {7 K        while(1)6 i1 s% L$ f; h% B0 H- g
        {
8 O; t2 L+ q3 @9 z                read_MSG_buffer(pshreRAM);9 u5 q9 L/ [' v: t
        }               
) U  d3 r# `: {2 `}
, Z& o5 Z& c8 m9 }
' J" V1 g4 ^& R: o, ^8 fvoid read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM)5 o# l; N2 |0 E6 c% p! R! _
{
! z/ |% a5 e, \5 @/ o; n& j' [        RX_MSG_PROTOCOL buf;- w+ p6 x. h+ N# C( n4 D
        
: ^: j1 ]6 G# S9 M        buf.a = pshreRAM->a;
( z# Z* ^! h* r* F0 g        buf.b = pshreRAM->b;% j: K* W  y- q; {5 B6 z2 e
        buf.packet_cout = pshreRAM->packet_cout;
- z3 b& Q0 ^/ _/ {9 x4 e        $ |9 d8 T- b+ c0 M
        if(buf.packet_cout != count_copy)
& ]- J# b0 P5 s$ {        {
# S7 W7 \# F6 t+ ^4 A) b. i                printf("a is %d\n", buf.a);
9 h$ ]6 B7 D- U7 K3 K1 w                printf("b is %d\n", buf.b);
. i+ T4 n5 a7 h                printf("count is %d\n", buf.packet_cout);/ E  e$ a2 l" x, w6 P) C3 {
                count_copy = buf.packet_cout;: h' u/ G7 w4 R
        }
" ^: u+ U  g* x, h        else
- [) f8 R2 t) A5 r; I" }        {/ t. ^+ l: a1 w- |. ?3 m( _1 n- n
                printf("No effective message!");2 @/ D- x+ n2 B  R% R
        }( K, J) X6 b; o: o
}# ]! \2 u  G" p3 `

  h6 w) |$ y2 |* z/ P0 `' a. ^: k0 z# r- k+ g: v
但是出现segmentation fault的问题,这是什么原因啊???我在DSP端烧写了一段小程序,向共享区0x80000000位置写入数据,用CCS 测试发现写入成功。
) B/ c) R! R0 F' P9 p! D$ }使用下面代码,对内存使用了mmap函数后:  \2 X5 g& S/ l- v# X* `- F+ g; ?- T0 G
#include <stdio.h>% t$ A& U7 `: d% P# r, y% g
#include <unistd.h>
4 [, [2 b8 i+ J6 F#include <sys/mman.h>
8 C, _! ~/ p: h; i& g#include <sys/types.h>% j7 A' _- G% f) u+ T  N8 i6 f
#include <fcntl.h>7 r- s* s0 [' H

$ m2 i) ~+ K# {2 t#define SHAER_RAM_BASE_ADDR    (0x80000000)
0 D$ h8 ~$ ]3 `3 j#define SHAER_RAM_SIZE         (0x20000)   
6 Y+ O8 ?! z$ E4 M  z1 Z: p
% R5 [: J2 t/ Z5 w. ktypedef struct
3 ~, ^* L* |- P( \7 t) \{
) R1 Q7 z$ m- J% @# H* S        unsigned int a;4 M5 [- ~+ i1 ^( a$ C2 q
        unsigned int b;# m* E' m/ F8 _
        unsigned int packet_cout;- ^+ d& |1 `1 b3 }# G
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;6 t0 T7 f& |8 @: Q6 C' u2 D! Y  m
% o) }9 _$ x+ r( a+ Q/ R
void read_MSG_buffer(int *baseaddr);& J  t& s2 J& Y- e5 o( v% J
unsigned int count_copy = 0;( ]) z+ ^- V% X; k4 A" ?) ~

  q8 W" c& |5 [9 [! v! Lint main()
" t, j* c+ n% b# ~{
3 V5 [$ f2 H: ^+ T# l' w1 z  Y- k. c        int fd;
) ~! U( v, L/ J0 Y' b5 z        int *mem = NULL;
" O9 Y% n; F6 N: v1 y1 U$ i5 O8 y9 W7 b' i
        if((fd = open("/dev/mem", O_RDWR)) <0)
4 G( u) L* K$ M        {
; j0 ]0 o5 U. d% a" l; j- b                perror("open error");
9 T0 m* _- g# s                return -1;3 C% K7 v- c- o. Y
        }+ }: k2 S" P, Q
        
8 `/ F1 j* S) k4 R; [        mem = mmap((void *)SHAER_RAM_BASE_ADDR, SHAER_RAM_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);, l7 y' l: e$ b- E3 m: w

8 P. U# z  c- {# s. u6 B+ P1 U        while(1)
3 d4 c. X" B, X        {
1 _% N+ k2 e0 U1 I0 j& J                read_MSG_buffer(mem);
; y, Z! j' n' f* T        }                  l5 E) S) o3 l3 J
}3 k4 D+ \0 ]7 h5 y
( I  v. f& A. ^4 p& N
void read_MSG_buffer(int *baseaddr)
$ w, `/ d% `) ~" o" D: \5 X0 [& d; n{1 ~$ t# M5 H: p# x# T/ L
        pRX_MSG_PROTOCOL pshreRAM = NULL;
' J& x# k/ ?8 s5 P/ h! D3 K" M$ E( d' g/ w1 G) L
        pshreRAM = (pRX_MSG_PROTOCOL)baseaddr;
$ [- r% x: h' q0 f' q$ h# o/ e3 O0 u2 r; M5 u/ k
        if(pshreRAM->packet_cout != count_copy)8 h% y7 o) L9 H
        {) ^) ?3 ~: f5 p2 H
                printf("a is %d\n", pshreRAM->a);) b( ^% v7 u. A3 G8 E* e
                printf("b is %d\n", pshreRAM->b);
2 A2 D# Y0 g5 ?* K5 z! k" }                printf("count is %d\n", pshreRAM->packet_cout);
5 P" \6 i( a/ C9 O6 H1 L                count_copy = pshreRAM->packet_cout;4 Z+ V, K% t0 J
        }
) e8 \/ ?6 B4 N        else$ b( b' c  `# e0 U; f% O3 K' Q
        {
1 c5 N( @+ Q- t2 C                printf("No effective message!\n");
* y+ \4 K5 o9 `        }
$ K5 t: p* l$ o}
1 ?3 [: f+ l/ C6 c& ^- a
3 u1 i* h' l- M& J没有出现segmentation fault这个错误,但是读出来的数据均为0。这该怎样解决啊???主要问题还是在Linux系统下,OMAPL138是否可以直接访问映射地址???该怎样实现???+ R! t1 ?9 y" g* \

! l5 r) g5 Y' M+ {6 J" w" p, \5 Q. R( o% z2 e# ]

0 Q" E9 `  s* M% M2 b  ]: }% H
+ N' E7 {# N# Y  X* N, ]- u8 n
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖
回复

使用道具 举报

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

本版积分规则

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

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

GMT+8, 2026-1-17 06:49 , Processed in 0.039817 second(s), 26 queries .

Powered by Discuz! X3.2

© 2001-2015 Comsenz Inc.

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