OMAPL138的内存映射是否在Linux下已经完成??? - OMAP-L138 - 嵌入式开发者社区 - 51ele.net
设为首页收藏本站

嵌入式开发者社区

 找回密码
 立即注册

QQ登录

只需一步,快速开始

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

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

[复制链接]

5

主题

6

帖子

51

积分

注册会员

Rank: 2

积分
51
跳转到指定楼层
楼主
发表于 2014-8-19 16:38:00 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 zc_fly 于 2014-8-19 16:53 编辑 * }( o, o) a  P4 z) a
: w( v9 ~* @4 C, u( ~" l
OMAPL138的ARM端对共享区内存进行直接访问,代码如下所示:#include <stdio.h>, g$ h9 F& i/ T
#include <unistd.h>& _" o8 C" t3 ?8 z( M( G
#include <sys/mman.h>; _6 |1 h( H2 k2 @7 a: i; u
#include <sys/types.h>3 O* T6 S" b% B" @" q$ W2 B  q
#include <fcntl.h>" o: |& `+ l& e; l* h

3 \( m# M  H6 m8 Y#define SHAER_RAM_BASE_ADDR    (0x80000000)   
. {0 q/ m5 o9 F8 j
& l% `0 C! e2 {* q: qtypedef struct3 x, y0 H2 \7 j+ B
{
( r2 {: F: g/ f2 I% i) N        unsigned int a;
& W1 }& n* r3 M8 g8 B8 s        unsigned int b;
  G$ k, y; W' \- N6 R' b  ]        unsigned int packet_cout;2 Y: t: J! s, K) b
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
6 j% t& c0 o' v
" k" a0 e' ^5 `- y5 V1 P$ `void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM);4 n  A$ F2 Z; F$ b7 r2 q8 |
unsigned int count_copy = 0;
/ p% p6 c$ G6 V. V( G; K9 g
, I2 z; \8 p( y. g: b* U4 H( ^* L( C
int main()
- y6 w. `& Y5 F. L{/ P2 O& k9 I1 u' _/ R. i3 C  R4 \
        pRX_MSG_PROTOCOL pshreRAM = NULL;% ^$ G' H0 s3 T9 T* q
        pshreRAM = (pRX_MSG_PROTOCOL)SHAER_RAM_BASE_ADDR;- L5 `+ O4 W' ~3 |+ y. F% u" K
: x' Y' r( O/ }7 h3 {( }" E0 x0 t* m
        while(1)
. G8 ]/ r" N5 {$ [        {
9 I" ?0 c/ o* q/ q( c% M! e                read_MSG_buffer(pshreRAM);* Q/ {+ t; ]6 A8 U, T* }
        }                ; N' \! J) K4 |' c9 f
}+ o! F* P+ u# b4 f6 f. @5 U3 R
% y: H/ _& ?- p" `* e* I( T
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM)
0 H1 B' D5 Z( {8 e{
8 R% }$ s( U6 A& ~: ]' m        RX_MSG_PROTOCOL buf;
, c! L- {4 v) }9 P+ @. [        
$ ~. W7 `% U5 o% T        buf.a = pshreRAM->a;8 U' X% K1 D4 Y* {# E$ k* U: R# W
        buf.b = pshreRAM->b;
8 ?8 l; N" _, C: D1 `$ C! d        buf.packet_cout = pshreRAM->packet_cout;
6 ]% y+ w; O0 e+ e6 g5 j        + u4 f; [9 n/ d" A0 C5 U8 c( J
        if(buf.packet_cout != count_copy)+ y' {! l6 |, y: m+ a5 {( j) L6 L
        {* o" i: w/ b, E% u% H0 s
                printf("a is %d\n", buf.a);. Z; N8 |& j4 N
                printf("b is %d\n", buf.b);9 r, h3 ^3 G% g1 Y: Y* d
                printf("count is %d\n", buf.packet_cout);. w/ Z2 }  c$ C" c3 F
                count_copy = buf.packet_cout;2 B5 N% M7 p' ?9 p6 P9 z6 G
        }
) V* c4 m' {0 L        else
, B  ?9 z9 {$ x        {
9 V. z( G# \1 y  e# ^                printf("No effective message!");) h" j- s0 O" O- j* u* H& |+ Z$ c
        }8 E- _& b' |6 I
}
% ?/ O) o' \7 L! B9 p* `# {% M# P' D( o5 K, T) P: g" `9 B

9 P% P$ y  e  F  W但是出现segmentation fault的问题,这是什么原因啊???我在DSP端烧写了一段小程序,向共享区0x80000000位置写入数据,用CCS 测试发现写入成功。* h7 T0 q% M/ {5 o
使用下面代码,对内存使用了mmap函数后:
& P& D( v9 R) M/ }# p3 i. k#include <stdio.h>
( b/ Z8 |" Q: ]2 u, `$ f: }#include <unistd.h>2 |+ H. Y. W0 V
#include <sys/mman.h>) t5 F. h" o% a1 i3 X- U) q- @
#include <sys/types.h>
/ R1 j1 Q5 ?) s9 E#include <fcntl.h>
& l1 M( q1 k. [0 n3 _- [( _3 Q5 c3 X" R0 d, S& f
#define SHAER_RAM_BASE_ADDR    (0x80000000)' K+ U9 T7 c: _; x' Q* }3 K8 l' d! |
#define SHAER_RAM_SIZE         (0x20000)   
& h) }/ o# ~4 e: S
. D( E9 \0 x9 t, j. Atypedef struct( r9 g0 T& v/ l: ^
{) d* D" e1 \5 A# _! `6 `
        unsigned int a;$ g! ]# G, A, k8 A* n
        unsigned int b;& a, z; {4 B! U  X$ k! n  C* W& }6 s
        unsigned int packet_cout;; }2 R8 c' B5 c# I6 i0 t
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
* s' p# O) K% o, L# l
/ s& m* a% f' ~0 n: y3 fvoid read_MSG_buffer(int *baseaddr);. T. D) Q- V5 n* M; L1 c
unsigned int count_copy = 0;- Q! M3 X# B  Z
9 Q( T2 q( A" V. c+ w7 l$ G. ^9 F- ^
int main()" u0 x; N+ J4 _3 i: A5 _" ^8 J
{  S) q) N7 U2 y% E2 O% T* c
        int fd;
7 y( h  ]. U4 Y. S! o        int *mem = NULL;
6 R. h" S  c& A. c  g7 w: x! ]3 r" W0 x: m' I
        if((fd = open("/dev/mem", O_RDWR)) <0)1 G& _& J0 ?# k8 a% Z
        {/ H* ]# U# D  C# H) e0 L
                perror("open error");
8 u+ {  Z& p- T: l1 h                return -1;
- s5 ^. m# _5 ]        }( {! L0 ?' c- G: Q0 i. f
        - x9 r% f+ T. b( |! n$ x7 u
        mem = mmap((void *)SHAER_RAM_BASE_ADDR, SHAER_RAM_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);' w  D  g2 X' ^: e$ u
. q5 b6 U8 L8 S- z3 G: ^5 o4 V3 E
        while(1)2 O$ d" J9 ?3 _: L
        {0 L! t, G$ I* e9 K
                read_MSG_buffer(mem);  V% e; j" O! g8 Z' a( ~
        }               
) G1 W  |6 F5 w/ }}& G" [7 R3 K0 I- Q7 H9 @2 O/ U3 ?

* B- \0 Z$ z4 C( E- Gvoid read_MSG_buffer(int *baseaddr)
% c0 R; U0 ?6 m2 S{
& l) v8 u' N8 |/ H        pRX_MSG_PROTOCOL pshreRAM = NULL;3 r7 `% E7 `+ M( x( G& b

# q+ Y$ V. S; g        pshreRAM = (pRX_MSG_PROTOCOL)baseaddr;
6 e& V8 C9 C, {/ L
  x& }6 e) l& U, l2 [- V& N        if(pshreRAM->packet_cout != count_copy)# }& H3 V5 t6 s1 v4 L
        {
9 a6 l% W1 L9 q, b' d6 R+ A/ i' g' \! r- l                printf("a is %d\n", pshreRAM->a);; {; N. y( m- }6 S  a3 y4 _7 A. B
                printf("b is %d\n", pshreRAM->b);
; O4 l; I+ x' W0 z3 t! ~                printf("count is %d\n", pshreRAM->packet_cout);
9 s: ^) |. u! K* @1 }                count_copy = pshreRAM->packet_cout;! I$ e* e0 W( X6 |- q; K1 e0 F
        }* G8 z, J# R) H
        else2 E7 i3 u* N8 _
        {6 A' P) @, Y7 S  @1 \; H
                printf("No effective message!\n");
" _! F$ O% K0 c# ~        }
1 J# L$ @) C, |( X9 q}$ V; S) V+ y/ \5 {* P! {, g! K

! ~1 l5 }& ?$ F4 i: {4 d没有出现segmentation fault这个错误,但是读出来的数据均为0。这该怎样解决啊???主要问题还是在Linux系统下,OMAPL138是否可以直接访问映射地址???该怎样实现???
% o, d$ H% l& H' i% @; f8 k1 E! N- B$ m1 i: G

( u( g& t( T, i% s5 d* w4 F: _1 I: j& F3 ~# g4 N2 \" S

( Y6 Z' p$ o; b0 k# R# n
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-11-23 17:48 , Processed in 0.051772 second(s), 25 queries .

Powered by Discuz! X3.2

© 2001-2015 Comsenz Inc.

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