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

嵌入式开发者社区

 找回密码
 立即注册

QQ登录

只需一步,快速开始

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

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

[复制链接]

5

主题

6

帖子

51

积分

注册会员

Rank: 2

积分
51
跳转到指定楼层
楼主
发表于 2014-8-19 16:38:00 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 zc_fly 于 2014-8-19 16:53 编辑
% S7 B8 o: I# q9 ?' o; E8 y5 [+ s6 T
OMAPL138的ARM端对共享区内存进行直接访问,代码如下所示:#include <stdio.h>( E! {  W# k3 b7 G3 S# V8 d- z
#include <unistd.h>
" o& L  q; {1 D+ h4 }6 T#include <sys/mman.h>1 a* i+ F2 z0 P
#include <sys/types.h>) \" O7 y4 G! x( E  H4 j8 B; Y+ t
#include <fcntl.h>( j' u. J: L$ p  w4 @; ~
/ s( T. P6 n! v
#define SHAER_RAM_BASE_ADDR    (0x80000000)   8 z: R# {  t' Y& E( M/ P+ T. p4 a, p) }

+ h- E0 e! _5 I8 P! L; f6 Xtypedef struct4 G7 i! m* E6 h. }
{
2 C) W$ m* g; U* x* n        unsigned int a;3 w; n7 H$ R+ x1 A
        unsigned int b;7 g+ e. u2 k" N; S
        unsigned int packet_cout;7 \/ w# j! i' ?$ K  J. W  Q4 |5 X
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;! c$ P$ s: n. \0 O) J# O4 D
9 L0 O" @" w4 r5 f+ P  _; A2 i6 k
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM);
" O6 @) w- h  Z: K9 @% Tunsigned int count_copy = 0;8 r, I$ |( p9 j" F

+ h" ^1 {% ]* ~1 P9 l5 I, `& V/ d( c* `7 t0 G# @) x# D7 m, L
int main()/ O7 F2 l' p. ^' u8 w/ U
{
! ]! x0 U8 d8 N. R; n& T+ K        pRX_MSG_PROTOCOL pshreRAM = NULL;
7 N. Q% V7 h4 E        pshreRAM = (pRX_MSG_PROTOCOL)SHAER_RAM_BASE_ADDR;* s7 J' ^0 H: E5 g* ~4 }9 g- h
% d; I/ N* m' _: e3 Q
        while(1)
4 N$ U4 R) G" F) F/ P' U        {
% x: C6 d3 Y; E* o9 K: L; G: D                read_MSG_buffer(pshreRAM);
- g* a# c! g1 y( K) q) b9 u        }                5 W; f$ H- t; S  T' {
}
% I" \( q8 @: U$ _4 n+ I# c/ E) o. p6 i3 Q
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM)( O: {  n. i- x) |; X
{
! v* G: A$ Z& Q, v# {& ^2 L1 n7 I        RX_MSG_PROTOCOL buf;! z4 _/ e  o/ N4 V7 e6 x- D
        
% Y! r4 _7 ?; @' d6 M. q$ m* V        buf.a = pshreRAM->a;
; [; t2 w% i& V# M. @" d        buf.b = pshreRAM->b;: t/ _1 @% c. m
        buf.packet_cout = pshreRAM->packet_cout;
! U4 f" k* J& {7 H        - d. c9 r. r& Q% m9 h5 ^
        if(buf.packet_cout != count_copy)1 _5 j! b* G  _# x8 F! v9 X
        {/ E( e/ m$ M) x! [
                printf("a is %d\n", buf.a);
0 F/ m' F# L) W7 Z* p3 ?0 y, L# B                printf("b is %d\n", buf.b);
% W. g8 r& p2 P' @/ a/ X                printf("count is %d\n", buf.packet_cout);
; K) e2 S7 x) {5 s7 g* D                count_copy = buf.packet_cout;
: T9 R8 s7 d  N. [        }
* V2 Z- L: l! m, D        else- N) \" `# S. u+ M3 W2 G% s2 F
        {
$ s) O2 U: `+ I3 n- P4 ~* X/ n                printf("No effective message!");$ s, @( g9 }  S$ O) c
        }
; N0 S+ x9 s3 ~9 c  F}
7 X. h" \5 {# L1 ~7 q3 i5 o+ n5 G: G" U$ W! J( e4 e
9 ?5 F3 b5 @& T/ q( [  M
但是出现segmentation fault的问题,这是什么原因啊???我在DSP端烧写了一段小程序,向共享区0x80000000位置写入数据,用CCS 测试发现写入成功。
, h) J5 G1 {% B使用下面代码,对内存使用了mmap函数后:, F# ]. J2 `* G
#include <stdio.h>! D1 S/ ?- \$ f
#include <unistd.h>& S+ q* @9 U2 n  u" I" X: |1 ?
#include <sys/mman.h>6 s, ~: k9 O8 `! k* n9 X8 H3 A% H
#include <sys/types.h>$ W. D& I4 h4 E1 v. M" G; w8 k
#include <fcntl.h>' a1 L0 H6 I! H! q8 G
- r2 V2 Y4 h8 S( ^) v1 ~# ?8 {
#define SHAER_RAM_BASE_ADDR    (0x80000000)
6 w+ H( e/ C% k6 \$ T  x4 x8 O#define SHAER_RAM_SIZE         (0x20000)   2 l2 E% d" |, A/ n
, F5 Q, @  e1 X
typedef struct$ ~2 U9 }& Y. q: t4 x$ o1 R* D/ D% o
{7 o8 m& l' y  r. G/ o; C
        unsigned int a;
% W( \" Y2 C5 W2 A        unsigned int b;8 D; p7 z" y+ c! b" X6 f+ ^" z
        unsigned int packet_cout;
) j. L. G3 v7 q! a}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;) G2 Z  _" F: z0 H& z
) Q3 T/ m6 P+ I; a) b
void read_MSG_buffer(int *baseaddr);
2 W  ?# M2 }  i  n6 |+ M6 c9 k+ H/ @unsigned int count_copy = 0;
# a: F: C3 D) z+ |& O( w; p1 H# i0 x1 u+ s5 K4 y6 L" p
int main()/ {* c9 l6 K% }4 B8 }( x. b
{7 u* s2 Y  e% \% t# B# r- I
        int fd;. t% D) H+ q1 B- |/ _* _
        int *mem = NULL;6 S, G" e# n4 H2 f3 V

; `0 W( N3 r2 x        if((fd = open("/dev/mem", O_RDWR)) <0)
$ F4 K; \1 d& `. j; ?        {
0 l3 H- q3 ?0 l, N' n                perror("open error");: T0 r" c$ s* V' |) Y- z  `7 M
                return -1;- Y- `5 t% I7 F
        }' H/ \9 B4 L- m( f8 O' J/ s0 H. d
        6 ~' \& I- ^5 p4 p
        mem = mmap((void *)SHAER_RAM_BASE_ADDR, SHAER_RAM_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);, p' Z. Q3 r6 W/ a3 s" I
+ b+ U; V/ [) D# h. e! f( r+ t
        while(1)
4 L& ~# o% n$ Z        {- q! y) |- c1 H0 T9 |& e$ m( w# d* q
                read_MSG_buffer(mem);% N9 o& Y$ y( J5 a* W
        }               
* D, R3 q9 D( M5 i) j}) o4 a  i, H6 j' X$ n& Z. c
9 {- Z2 d% C& P  }9 R
void read_MSG_buffer(int *baseaddr)
# o% i! f3 G1 I& h) z4 t2 y  B{- L+ ~8 j2 @6 y2 R7 y' s
        pRX_MSG_PROTOCOL pshreRAM = NULL;) G, s8 }& f' w% b+ a) M: l, U
0 c, G3 X" |. G
        pshreRAM = (pRX_MSG_PROTOCOL)baseaddr;1 ?. N+ C8 ^$ o3 B
$ L/ N+ u0 m* z' i
        if(pshreRAM->packet_cout != count_copy)% I3 f* o3 i1 ]% v' n. s$ T
        {
. X  b5 C  m; A5 r% E8 A9 g/ u2 {                printf("a is %d\n", pshreRAM->a);' m; U+ g$ a, U, T. o# e, m
                printf("b is %d\n", pshreRAM->b);
- W( f2 \% S& F, G. Y+ e) }9 ~& w                printf("count is %d\n", pshreRAM->packet_cout);
# W) t! S- |& ]" M) y  X, S                count_copy = pshreRAM->packet_cout;
& T6 I3 D( W  C! \5 t        }, ~8 P' d" ]5 u6 q1 S6 M! L0 y
        else% M  L. A$ M' q, d
        {
9 r# |9 C9 j0 d$ R/ C  D                printf("No effective message!\n");
( V: g9 ~4 g: H# x3 f        }
' T# Q7 h9 [  K- ^: i7 S0 L# G}7 a0 a0 t& m2 y. W$ u
  }' m7 v  k* m. q  y6 @. ]
没有出现segmentation fault这个错误,但是读出来的数据均为0。这该怎样解决啊???主要问题还是在Linux系统下,OMAPL138是否可以直接访问映射地址???该怎样实现???
# t5 v: Y( B* \3 `2 y3 ~# j: r) q9 c5 U$ s9 Y
' ~& `/ w# Y; k& }

& o3 @: T) G1 f* k; O( y* j& v) L: p5 Y; ~- i- J" C, ~. T
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖
回复

使用道具 举报

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

本版积分规则

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

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

GMT+8, 2026-3-15 02:11 , Processed in 0.045721 second(s), 26 queries .

Powered by Discuz! X3.2

© 2001-2015 Comsenz Inc.

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