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

嵌入式开发者社区

 找回密码
 立即注册

QQ登录

只需一步,快速开始

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

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

[复制链接]

5

主题

6

帖子

51

积分

注册会员

Rank: 2

积分
51
跳转到指定楼层
楼主
发表于 2014-8-19 16:38:00 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 zc_fly 于 2014-8-19 16:53 编辑
" v8 E' d$ U" _# k; F' e. F" N
. c/ a! C/ U0 f6 G0 sOMAPL138的ARM端对共享区内存进行直接访问,代码如下所示:#include <stdio.h>9 o- k1 q, S# h+ m0 v3 F, {- Q
#include <unistd.h>6 }2 d7 F3 Q- I# Q/ w; v4 A: [
#include <sys/mman.h>& w7 o" r: h7 k" I
#include <sys/types.h>) a- w: w$ D) L! O) o3 B  _. T
#include <fcntl.h>0 b* |" ]) v. d9 a# `

4 R- d  `* r* V' ?* j#define SHAER_RAM_BASE_ADDR    (0x80000000)   
3 u* t0 P1 @, g$ I! A4 i' E! E/ X* L$ ^, B" [
typedef struct) R& S- t  D$ k
{
* Z9 S: Z3 g0 H" ^        unsigned int a;
! a8 R; Q+ d7 }9 c% `        unsigned int b;' h' Q0 Q, f1 v, K; ^' `4 K0 ~& V
        unsigned int packet_cout;
3 X. M* h' T. b}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;( F# `- Q3 s3 c7 ~

% j' @2 o  R( s+ vvoid read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM);; ^  W$ `" g0 S( P) O( ^8 C" N
unsigned int count_copy = 0;
6 V5 `9 S% N. e) Z+ N" m
% _$ Q; q) k! R) }4 \6 ?/ |! d* P. z; ]' {
int main()' y3 R! G9 g; r! M! w  }
{7 U6 s/ u# s2 ^+ |; o. w
        pRX_MSG_PROTOCOL pshreRAM = NULL;
$ [# m9 A5 `: C7 B5 U2 d  \        pshreRAM = (pRX_MSG_PROTOCOL)SHAER_RAM_BASE_ADDR;
4 N& c$ r# V* i/ |, l( ?0 l8 `
( C/ ?5 |/ W0 M        while(1)6 Z* h' i4 Y+ H4 E# m
        {
* I& N5 a' g: `                read_MSG_buffer(pshreRAM);( a( ]" j5 W8 ^7 o$ e+ {9 {
        }               
$ I" U  K: t, y" ]; J}% U! e8 _# A3 }% I" d
$ `$ F, k% u- E$ @- P; G; E
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM)
0 t- U9 d- J: G. i* `% E. `! Q{
8 N! r) k) w" }8 C- U        RX_MSG_PROTOCOL buf;  g3 S+ N4 H' n1 V/ O; @
        
( h7 K1 Q0 M& F7 ?0 b- S        buf.a = pshreRAM->a;9 B7 B. K' ?9 G. S  h: d
        buf.b = pshreRAM->b;
2 m. D! [" M1 [. }8 S# P        buf.packet_cout = pshreRAM->packet_cout;6 p2 T) k- S/ R: b
          ^2 ^4 t3 }) |3 @1 J+ Q
        if(buf.packet_cout != count_copy)9 {& x& Y8 k/ e5 |4 M& s
        {  s* u" ~' \7 o* r
                printf("a is %d\n", buf.a);
. p! j8 }7 \; T3 g9 ?) |                printf("b is %d\n", buf.b);2 B+ m/ U) b: U% J" C
                printf("count is %d\n", buf.packet_cout);8 y0 }; N% p+ O9 u" z; x) B4 f
                count_copy = buf.packet_cout;
# i( ~- J# Y4 X% o        }+ _0 }3 \% ^1 v, Z% A$ _
        else/ k- \1 k6 N8 B2 `! a! q
        {( [* S8 v* ~. L& E, g7 v
                printf("No effective message!");& e: M9 t5 ]( F* t7 ~* ?! c
        }
1 p1 ]3 {7 t, F) M! H, |0 U}7 s: D5 D5 w8 E

! d* j3 B" R; J# Y. ~* `  v) C0 u  v( N+ f" n
但是出现segmentation fault的问题,这是什么原因啊???我在DSP端烧写了一段小程序,向共享区0x80000000位置写入数据,用CCS 测试发现写入成功。5 b2 u5 Z( \* z6 |, P2 J1 ]/ [" O0 b2 r
使用下面代码,对内存使用了mmap函数后:
; n; f: N# G  |3 c" u( e4 M3 S( [#include <stdio.h>
- j) F* }: X  b  g#include <unistd.h>
6 O" R9 z( ]5 `! ?( H+ U4 J#include <sys/mman.h>
" y% W* l+ b* c' s0 w4 V#include <sys/types.h>3 k# A" s! U5 f! u# Z+ e( J
#include <fcntl.h>
" E* I: l& [: d- b' b: t
# k3 Z# [3 c4 z# o2 _' K0 i#define SHAER_RAM_BASE_ADDR    (0x80000000)
2 R3 P: L/ R2 R% x7 F#define SHAER_RAM_SIZE         (0x20000)   
* I3 `( a3 v; {( z" a0 Z- {/ I! W' ]3 L
typedef struct4 a$ h8 |5 b1 s/ a  s, x' O
{( P7 T8 z, e# h8 y; ~  n
        unsigned int a;
7 w! L/ B; G  Y3 D) N& t        unsigned int b;+ i! p% C, G1 H+ V: ?8 T
        unsigned int packet_cout;& f' ~$ O$ W7 E! E3 u! y3 |
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
; l; A3 ]3 }' m2 `) R. Q- L
# u# j0 I! |/ s+ _3 Z9 cvoid read_MSG_buffer(int *baseaddr);
/ V0 ^- v7 R, p/ Munsigned int count_copy = 0;( _! f( L$ K+ N. }8 m8 }# E! B* M5 X

  G7 g" M$ W0 z6 M* d/ Aint main()1 V6 _, @* f; X4 z9 W
{4 T, U6 K2 q6 c3 O/ b
        int fd;
2 A4 p, C6 f. F8 u5 ^! z2 P: t$ B0 ^        int *mem = NULL;, p2 o  k, X, i. d& V2 c% S

# e' N5 n8 f! Y1 r        if((fd = open("/dev/mem", O_RDWR)) <0)6 Q% P0 o& S6 w4 F- |
        {1 S; s2 f0 F' |0 l+ p, p% u9 I6 _0 l$ x, [
                perror("open error");
# E, r$ R* U3 A4 s                return -1;. j2 m. l" m+ f
        }
0 G. b+ t" G) \6 x! [; k( E        1 W5 H' V: A+ p' G5 |* |3 C
        mem = mmap((void *)SHAER_RAM_BASE_ADDR, SHAER_RAM_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);
# h: e: N4 b7 q  s$ t" Q4 o! ]) w: V
+ O0 a9 H: u# M        while(1)
9 [  r% l/ }$ z/ p$ d. ?8 q; j        {
1 ~( ?8 D! H3 s: _0 {1 {1 p, O                read_MSG_buffer(mem);
. Z2 u- i8 S& e9 ~6 M: Y        }                9 ?3 v/ A4 M" s) t# J3 ?
}% m/ t% ?- L* w! S% i% F0 r! i
8 k$ K1 R  p/ O6 n( ?2 f1 O
void read_MSG_buffer(int *baseaddr)
' a9 v6 r$ Z/ D3 D5 l' {, e5 {3 Y6 ^2 [{
8 ]; ]. A7 T  C& U        pRX_MSG_PROTOCOL pshreRAM = NULL;$ ^' V6 m! C* ~9 z1 m
. x8 u& k+ a9 Q- O' k4 u& n! S0 Y! G
        pshreRAM = (pRX_MSG_PROTOCOL)baseaddr;* c4 V/ P7 E" O! `- r! e+ B% e% r

. ]$ \6 D" Q) m3 H2 Y9 R, p        if(pshreRAM->packet_cout != count_copy)
. G" M$ t$ F& V* y4 X* d0 m        {7 K* z; ]0 _1 k: l0 p/ f
                printf("a is %d\n", pshreRAM->a);  f3 F1 n7 ?: d8 m* F/ J
                printf("b is %d\n", pshreRAM->b);
) A+ s5 I  ^/ n% p) G% X                printf("count is %d\n", pshreRAM->packet_cout);+ {% N+ g. Z; R* T
                count_copy = pshreRAM->packet_cout;; m9 \: o# l) Z) e" K; w
        }
+ q, ^! Q( n# |/ I- ^- B! I        else' F/ \& G7 ]5 X) ]
        {
6 B/ P, c" I% y+ U9 X                printf("No effective message!\n");; h* k* V( i6 b$ e7 |; `8 }
        }
6 S) P* i- l2 g! Y}
+ U( y& O3 x# b2 Q0 i7 g$ r* f. C9 f! |$ Y. ~" m0 ]
没有出现segmentation fault这个错误,但是读出来的数据均为0。这该怎样解决啊???主要问题还是在Linux系统下,OMAPL138是否可以直接访问映射地址???该怎样实现???& B& v" s' f' |  w# a! [3 }

7 d5 H5 P$ C5 }) c9 X0 P
+ J% b5 m- v& k8 q! {. |
$ @& e; N: O' g; y5 Y! w& C9 O6 ?& [
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖
回复

使用道具 举报

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

本版积分规则

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

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

GMT+8, 2026-2-1 13:49 , Processed in 0.042049 second(s), 26 queries .

Powered by Discuz! X3.2

© 2001-2015 Comsenz Inc.

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