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

嵌入式开发者社区

 找回密码
 立即注册

QQ登录

只需一步,快速开始

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

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

[复制链接]

5

主题

6

帖子

51

积分

注册会员

Rank: 2

积分
51
跳转到指定楼层
楼主
发表于 2014-8-19 16:38:00 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 zc_fly 于 2014-8-19 16:53 编辑 0 G* ^. o; X0 C1 z- ~" U
4 s) o9 I8 \% e0 m/ q" K, W& t
OMAPL138的ARM端对共享区内存进行直接访问,代码如下所示:#include <stdio.h>
: [+ e/ M7 k4 [- C. S. f#include <unistd.h>
; `( h+ T+ z- B4 {; B- v#include <sys/mman.h>
6 ^' V* C4 j& `* m- H( G! X#include <sys/types.h>& M5 H3 T4 R3 Y1 V! D1 r6 {
#include <fcntl.h>
* P0 [4 X6 }$ V9 x1 f3 M/ W& j7 H. L, s' n/ ]8 e# C
#define SHAER_RAM_BASE_ADDR    (0x80000000)   
% s/ C; ^3 s8 ^: V
7 S  O4 S, L" b/ }, Htypedef struct
7 C( T  @3 R5 k% q: G+ ]. q9 ~{, n! H. W- T+ ~7 P. F7 z
        unsigned int a;+ Y" N) a3 Y. h( S
        unsigned int b;
' g" P) u2 Y4 X6 A6 S/ l: H        unsigned int packet_cout;
0 k2 w, d: X6 p) i4 D# s}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
! I  R5 b* t! O/ K  d1 ?+ Y5 e
; X1 A$ T+ n  C' e4 Ovoid read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM);
5 a8 \! s7 G8 ?0 z% eunsigned int count_copy = 0;( i6 j! N; \# }! Z

/ g* ~7 ^9 Q; S3 H" O. `
# ^! D  F# u- R% h: u* {) R) Pint main()1 s+ N1 l$ D5 w+ |1 q5 {4 {1 }/ P4 _
{3 @( X- O- ~/ X7 F) Z
        pRX_MSG_PROTOCOL pshreRAM = NULL;8 ^& Z9 h: d- @4 L9 x9 _9 M! d
        pshreRAM = (pRX_MSG_PROTOCOL)SHAER_RAM_BASE_ADDR;
" j8 S" q0 u* K& Q! t  S2 O5 q' g3 m9 D  T+ h; {
        while(1)  n* \1 M( u" u- M  s1 ~8 z
        {
( e. w7 {4 q! P6 a9 G                read_MSG_buffer(pshreRAM);
) y9 s: y7 |! T5 L        }                - m" D3 u) |" E2 I$ W; K2 S8 a
}' I8 D) h/ v0 G+ P8 u4 B

$ k3 U8 N: a2 t3 E# x  dvoid read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM)
. Z1 K+ q7 L# L2 M' j  D* L{
. c; p2 j2 a/ X/ w; W* o        RX_MSG_PROTOCOL buf;
- u9 N7 h! Z3 ]- P        0 w) s% U( y1 h, |& T
        buf.a = pshreRAM->a;0 ]  r* A0 w, n  Z
        buf.b = pshreRAM->b;
/ n2 H' m1 w8 e4 U$ q9 F        buf.packet_cout = pshreRAM->packet_cout;9 J; J5 u. F2 l- `" k
        
2 u# y! n: Z+ X$ [- t0 o        if(buf.packet_cout != count_copy); o+ R6 k9 ]& W/ L% P, A# g: o
        {
8 D2 i8 t* Q5 i8 D4 Y1 c. J; s  ~                printf("a is %d\n", buf.a);" A. x) N% x/ |: i
                printf("b is %d\n", buf.b);
  b1 k  x% b  x5 i                printf("count is %d\n", buf.packet_cout);; M4 P% K$ |8 m5 S: Z' V
                count_copy = buf.packet_cout;1 f1 u$ r$ M, F, i9 M6 u) S
        }
; A* V; p- t! K: p; W        else# \% {- U7 L* R/ C
        {% f( |9 N. D/ I
                printf("No effective message!");
8 n0 m9 |2 c3 K2 \4 ?3 p4 b        }
: Y7 `; H* g4 C) f0 X) T" j" B}
7 E% u' M( H/ }3 ]' V) X' P* F+ e+ }  Y( d. l

1 I; I4 P& W& @' [  i6 m$ V. E但是出现segmentation fault的问题,这是什么原因啊???我在DSP端烧写了一段小程序,向共享区0x80000000位置写入数据,用CCS 测试发现写入成功。  A* g3 g2 o* ^' B  M
使用下面代码,对内存使用了mmap函数后:; a) V1 m  V+ }$ e! p
#include <stdio.h>
* U1 Q; y4 f$ R, @/ t( v#include <unistd.h>0 ^, N3 v* M3 H9 v# @5 N
#include <sys/mman.h>
+ S9 r; P; j: c$ Z" ~! ]#include <sys/types.h>$ C4 P( k& e7 h$ V
#include <fcntl.h>! d7 w: a3 q. @+ u. @
4 `, w( i* a! W/ U2 r
#define SHAER_RAM_BASE_ADDR    (0x80000000)/ ]) l. A( G& d5 Z7 w
#define SHAER_RAM_SIZE         (0x20000)   6 F' i: m$ n+ K" b' w& r) U/ v/ V, F

) u7 B; ]) y6 y" [typedef struct
, [( @0 v5 i% p- V8 o: J# C1 X4 P7 n{  U  F4 C! ]# V
        unsigned int a;
2 s9 I- T. N! o7 r        unsigned int b;- ^) d/ r4 W9 z: \/ Y( n- t' P
        unsigned int packet_cout;3 q" `( V# f# J% b5 E7 j% d
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
9 I0 e+ X8 |- P. c" r1 Y8 R( N/ `- U" a+ E3 n2 z
void read_MSG_buffer(int *baseaddr);- m+ ^% O; N: C7 u/ r# D
unsigned int count_copy = 0;& w. ~- c8 i. j( e; r
( p1 q0 o% t+ J& V' Z8 Z+ t" J4 V
int main(); _9 t) N( d8 `5 R: O: ~& u8 L  |2 Q1 x
{  T, V% c5 v) b( k: N, n- ?
        int fd;; o! {! k0 E4 K$ O
        int *mem = NULL;
# N: [' h  |) G1 t) P  G  s
2 {# D- z/ O8 i/ Y8 u        if((fd = open("/dev/mem", O_RDWR)) <0); J& p( g" S, L, H% L
        {
  u: Z* F( s* c' V                perror("open error");6 F- P/ J; b+ q
                return -1;
" u. Z- z) P% B' E8 t        }; S* R' c3 E( n7 H/ P9 C! i
        
$ s0 t( E/ }# ]6 `2 L        mem = mmap((void *)SHAER_RAM_BASE_ADDR, SHAER_RAM_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);
" A8 x9 M# t% j6 d, t2 ?7 i6 c0 V. f( T4 f. B
        while(1)1 G0 |& N% U" c: v8 c
        {: @$ Y  [, y# F8 ]  \: I5 v
                read_MSG_buffer(mem);
+ h) [2 v5 Z5 @" X+ q( S2 A- Q+ {        }                3 d7 R  w5 s6 V- a: z! Y- U
}
9 P# k) P3 @) i3 h% c2 s+ E) e: z4 M! ]( K9 {2 N$ z" Y
void read_MSG_buffer(int *baseaddr)" N1 l1 A, J2 N* [1 ~- u& `5 ^
{
7 i: J# c& A# M7 \        pRX_MSG_PROTOCOL pshreRAM = NULL;/ P, u9 J& \" p% `+ p2 y. x9 P
! |- W7 c& D9 R, C
        pshreRAM = (pRX_MSG_PROTOCOL)baseaddr;
! D0 Y" L) s' w8 E0 ~
2 X( P: X' y0 ^3 N  g        if(pshreRAM->packet_cout != count_copy)* s1 `' q0 Y4 B# x% n; M
        {0 N, G3 F* {6 J. n6 O- P: J7 u
                printf("a is %d\n", pshreRAM->a);9 L' m6 d: p0 h3 p* f
                printf("b is %d\n", pshreRAM->b);% G- ], F0 U3 X7 m. N0 F, j6 K8 k
                printf("count is %d\n", pshreRAM->packet_cout);) ]+ R: [; y6 V0 V  I: n7 Z
                count_copy = pshreRAM->packet_cout;
. T) z' I, B. y+ K2 o        }
1 J/ V. j2 f: W: u; \$ a        else6 [( `% @; y6 p' U6 U9 @2 o* a1 b
        {/ ^+ |- O) ~, b' C* A( z0 h4 z5 t! t
                printf("No effective message!\n");
4 J! u! q7 |2 O1 Z: w6 g# g        }
$ x! `/ b% O7 v( \# c: G  E# B3 w& w}) m: ~+ F: l% V) A7 w5 W$ M7 L

' ?$ r0 q& m2 K0 p% y* l: {4 [没有出现segmentation fault这个错误,但是读出来的数据均为0。这该怎样解决啊???主要问题还是在Linux系统下,OMAPL138是否可以直接访问映射地址???该怎样实现???; L2 N4 f7 I% {5 O7 g* [* E
2 k/ B: F8 K0 W1 j& b5 I
0 F/ P$ h3 g% l3 Z. j
, f; Y! u) q' z7 c
9 ^3 R. Z2 b# l( t7 s3 y
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖
回复

使用道具 举报

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

本版积分规则

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

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

GMT+8, 2026-3-30 06:43 , Processed in 0.041250 second(s), 26 queries .

Powered by Discuz! X3.2

© 2001-2015 Comsenz Inc.

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