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

嵌入式开发者社区

 找回密码
 立即注册

QQ登录

只需一步,快速开始

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

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

[复制链接]

5

主题

6

帖子

51

积分

注册会员

Rank: 2

积分
51
跳转到指定楼层
楼主
发表于 2014-8-19 16:38:00 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 zc_fly 于 2014-8-19 16:53 编辑 + P" Y& P- Z$ z8 c5 p) @, b

  e! Y% T% j; G+ k( P! U) zOMAPL138的ARM端对共享区内存进行直接访问,代码如下所示:#include <stdio.h>
) B( g. J, r2 r2 p2 F#include <unistd.h>) E4 H# S! h8 J2 n" x9 a
#include <sys/mman.h>
& ^7 e8 g; [  k& G" X" Z#include <sys/types.h>
, W, |+ x: |( j* m$ [#include <fcntl.h>" q" j3 i  V$ B$ k

1 m+ a* d" J5 V! E% k+ O. }& U& Q#define SHAER_RAM_BASE_ADDR    (0x80000000)   - D% [7 D" y$ D$ c( [

; a' q! e6 {9 ?( D( o1 Qtypedef struct) I, G: v' O; [9 `  }/ e3 e
{" x+ R4 ~% U5 f; h
        unsigned int a;
) Q* ?' {& g, a8 ]        unsigned int b;
; N! T0 p% I5 P( s7 Y  e        unsigned int packet_cout;
4 A  g; T  s( b+ S: r. O}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;9 e, ]4 L6 D  W" ]! w& r# e0 Z! |( c

) T8 R/ ]% N5 v( K$ K3 N9 M4 Svoid read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM);
6 \5 N& F4 A: A, X0 m2 Iunsigned int count_copy = 0;
% N; y( E. v& S# |3 n% T7 \$ M" ?) ]' V- `7 u  \7 U$ F5 n7 @/ t# ]$ v2 e

0 _" E& D- b, y" W8 `% x1 ]int main()
: e  g! o, T) |{
: a4 \' }5 Q+ |# @2 f' C        pRX_MSG_PROTOCOL pshreRAM = NULL;
, ?1 {& v& H+ ^1 i& h; g) J. I' V        pshreRAM = (pRX_MSG_PROTOCOL)SHAER_RAM_BASE_ADDR;) j" u" T4 D- H6 j3 J- E% i5 H7 k7 G
# C! H0 x/ b: t# \
        while(1)
/ X( e. w! s1 l. R7 V% {        {
; s, Y4 X/ f, @5 ^/ H) U& k                read_MSG_buffer(pshreRAM);
/ @) E' z! {/ W3 `; [! g' ?/ C        }               
! M9 v5 K3 U0 x: c8 [}
: e" O' D' w) J5 t1 O- x$ h- F% w8 E+ |
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM)' O4 z% M8 x; A8 o# R; P
{
" T4 G7 h% n% p3 s3 v; C        RX_MSG_PROTOCOL buf;$ m, U3 F4 X; K, I) ?" M- w4 c
        
$ Y& l3 Q% C9 u1 y        buf.a = pshreRAM->a;
# X& f, a  r5 g/ d        buf.b = pshreRAM->b;( ^7 ~  O! H# D* R: n* x& Q3 a
        buf.packet_cout = pshreRAM->packet_cout;3 E8 u% a9 n- E/ J1 o! j
        6 r, l. x# M. I  A6 a( q
        if(buf.packet_cout != count_copy)
4 r4 W' Y' ?! O5 C9 Q        {) U2 N5 u2 c: D+ M6 \6 D5 R& }: L/ \, x
                printf("a is %d\n", buf.a);
& B7 ?  _0 x9 G' n+ E  i                printf("b is %d\n", buf.b);
& ~8 [* x) u+ M' x. c3 ]: u/ A: j                printf("count is %d\n", buf.packet_cout);4 |% z5 x" |/ h* e8 L) _
                count_copy = buf.packet_cout;
. w, S8 o* J) d7 j        }
; d) a& ?; a& u3 d        else3 o/ ~& j6 n. S/ o5 y
        {
6 R* N0 K: L9 s$ i0 |                printf("No effective message!");: }0 F: X0 H4 E5 o
        }/ V' G: x/ M- l# s2 L* B8 x
}+ H' J( [5 B& \- V; k" U. Q8 p
( h; J8 r" R1 g
  g$ @4 K& F3 f0 n) v
但是出现segmentation fault的问题,这是什么原因啊???我在DSP端烧写了一段小程序,向共享区0x80000000位置写入数据,用CCS 测试发现写入成功。: W& C3 {4 E' K0 _3 m
使用下面代码,对内存使用了mmap函数后:
/ o, n- Y& Z' t- U) P) O* x7 F1 e6 T#include <stdio.h>
* s( k' n: V6 L# }#include <unistd.h>+ [7 Q. K7 C  V# x/ A' C
#include <sys/mman.h>
5 U. s: h$ I- I; ], u#include <sys/types.h>
, p) i1 N( J5 o7 [, M- q# J#include <fcntl.h>/ E* R0 b2 m3 L6 Y, a
  j4 I7 v9 y" P" P% H) w2 ~
#define SHAER_RAM_BASE_ADDR    (0x80000000)
0 p8 H0 I8 ~- R7 Y) i& i* I! O#define SHAER_RAM_SIZE         (0x20000)   $ T- @7 ]; _6 {3 y: K, c( ~$ _
4 h9 h0 V% U0 C" ^% X+ V' f
typedef struct
. V" S, U/ V* X8 x% h/ u{
$ t5 v2 i6 G- S: ~! W; O7 g        unsigned int a;
& v8 [6 M4 A2 w        unsigned int b;- T5 k2 e+ N  g% a7 ~
        unsigned int packet_cout;
) g) m. m! m, k& S: Z}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
2 a, `- o+ g( ?0 \9 b
4 w/ {) e+ t- U4 wvoid read_MSG_buffer(int *baseaddr);
& Y0 h* Q# B1 s6 Dunsigned int count_copy = 0;
8 H% |0 }1 }* D5 z! j+ Y5 c6 l: b
$ m* o# i  a8 rint main(); g8 ^# }4 G# X" x
{
+ J) Z" a8 X  }7 W8 E. e% R        int fd;5 Q7 h% ^" I5 F! s0 _# [
        int *mem = NULL;
0 Q$ S/ K% d) F9 b4 H
1 n6 y$ l3 a2 J3 g) B        if((fd = open("/dev/mem", O_RDWR)) <0)8 H: ~! E$ F' C
        {/ p( B1 c7 y& j, C
                perror("open error");' g5 y8 H, H0 Y, l; m7 j
                return -1;: S9 o/ s5 N+ D# w
        }7 j: U) j) w) d7 M" V5 V; B3 N! h
        
( s; i3 c0 t4 p* d        mem = mmap((void *)SHAER_RAM_BASE_ADDR, SHAER_RAM_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);
* o" R4 F; Z' A+ [& V
5 V8 i2 ^% |+ Z! G6 S        while(1)
: V9 n9 i& q# C( W/ b& E9 L        {
0 g  W! k: b7 W8 W4 ]                read_MSG_buffer(mem);
. _' m0 r7 Z0 r, D, ?: u7 y% }        }                0 B1 g" d: W. C! L* N! G
}( W9 v2 F' u$ q- J% E+ e: p

1 H3 v: I# F. K% Z* ?6 zvoid read_MSG_buffer(int *baseaddr)
; [- n9 c$ f4 C5 Q{6 ~3 |1 f7 S  j
        pRX_MSG_PROTOCOL pshreRAM = NULL;5 [& ]5 a8 L0 K# }) n

) J( n/ S9 M" y7 T% ?  q        pshreRAM = (pRX_MSG_PROTOCOL)baseaddr;
. E: i0 Q) Q' |, Y8 \
. T" m) V  K/ S+ V& Y4 E* F        if(pshreRAM->packet_cout != count_copy)8 Y' w- O) H2 [5 o5 J9 \
        {
4 N. ]2 f! w) D4 q& J+ K                printf("a is %d\n", pshreRAM->a);
6 W7 M& P$ E, I/ m# O0 i                printf("b is %d\n", pshreRAM->b);( J7 n7 I( N2 \; o6 u0 x1 E4 e
                printf("count is %d\n", pshreRAM->packet_cout);
! K6 H. \: x# }0 K, R                count_copy = pshreRAM->packet_cout;" Z5 T! O8 j1 w2 M- o
        }7 y4 a& u9 ]: o
        else: s. A- y' S! G3 z: z+ L
        {) I0 _' M) N* T8 I: J
                printf("No effective message!\n");4 o) P: ^. z2 {, |" b5 z7 ?
        }( H" M0 k. B9 T1 c" H+ N
}
  Q& b* S! y4 W2 z: \2 B) w/ X8 g$ E2 [' s( U& n0 M
没有出现segmentation fault这个错误,但是读出来的数据均为0。这该怎样解决啊???主要问题还是在Linux系统下,OMAPL138是否可以直接访问映射地址???该怎样实现???
0 f2 C( c: J( f' }- z) s* G% M
/ C/ g& h# A% j/ V6 @
& ?4 R0 j# a) b' \8 V3 m: U/ L: t5 U6 p1 |, A: y
: X& n$ q& z7 c( M; h' `4 ^
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖
回复

使用道具 举报

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

本版积分规则

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

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

GMT+8, 2026-2-23 16:20 , Processed in 0.043178 second(s), 26 queries .

Powered by Discuz! X3.2

© 2001-2015 Comsenz Inc.

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