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

嵌入式开发者社区

 找回密码
 立即注册

QQ登录

只需一步,快速开始

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

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

[复制链接]

5

主题

6

帖子

51

积分

注册会员

Rank: 2

积分
51
跳转到指定楼层
楼主
发表于 2014-8-19 16:38:00 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 zc_fly 于 2014-8-19 16:53 编辑 * o7 |) K9 q& l  Z3 ~; e( j

7 f, K) o3 A1 g+ |% ZOMAPL138的ARM端对共享区内存进行直接访问,代码如下所示:#include <stdio.h>* L" f3 N, B$ W8 I* r
#include <unistd.h>
6 ?6 R+ @# f) [$ c" u6 ^2 d& f#include <sys/mman.h>
9 ]( }% @& q+ y9 e$ o#include <sys/types.h>& W# ]8 @, J0 o  k
#include <fcntl.h>
- ~4 S& R) ~; O& @
. K6 I" x- N; h/ {) e#define SHAER_RAM_BASE_ADDR    (0x80000000)   ! ~; S4 u  Z+ b' }& x  ~* E

6 o2 ?5 p  a4 _' ?* H, K! Rtypedef struct$ I0 j' i* I8 d8 ~! m9 T
{" e, K1 s1 j; J1 ^1 r
        unsigned int a;
/ q; I/ ?' @# G        unsigned int b;  A9 T7 ]: C% k: Z7 m% ]3 Y
        unsigned int packet_cout;
3 v8 S& I4 V% k# w0 B) G4 x4 l* Q}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;! F& I4 ]  G7 a5 T+ P% |( W

5 ?$ z9 V( b# T2 z0 avoid read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM);
4 ?6 d8 z) A: ^unsigned int count_copy = 0;
5 o% P5 Y% C6 P- D' q
8 E1 N  y# Y$ c. n! u, ~# h: }
2 `! c0 Q$ M7 C& p" h" nint main()
4 ]/ ~! }2 B8 R! H' W{
( E. X% i! Y5 L, C        pRX_MSG_PROTOCOL pshreRAM = NULL;+ Z; O% F1 `7 F2 J: Z
        pshreRAM = (pRX_MSG_PROTOCOL)SHAER_RAM_BASE_ADDR;# A5 y1 ~* \% D. F6 k" G
1 W% I. @8 D. b% r+ ^- o
        while(1)
! U. [" v5 s; B# `7 X        {9 l5 M/ l$ d$ X% O4 q, \/ j
                read_MSG_buffer(pshreRAM);3 f  @# D3 G4 `+ P2 o; \! x
        }                1 }# x8 d3 z" X1 A6 e1 i
}. ~  N2 V/ p5 u) W
- A9 L& x: [) |8 z1 C4 ~
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM)# g; c% j# Q- x% k6 E) R0 e! t
{' T' F( p5 g- V3 I1 C$ H
        RX_MSG_PROTOCOL buf;
3 a- n* r, L# e5 I5 j0 z. v        
( x5 ]% D8 E3 j3 r* P- J        buf.a = pshreRAM->a;
/ ~9 y$ Z; J$ F  _# K        buf.b = pshreRAM->b;
9 V0 T2 P( X4 ~& d3 Q- |        buf.packet_cout = pshreRAM->packet_cout;
+ B1 B+ k/ P* l        
' s* J3 y+ [" {# L- Q, e( ^$ D9 L        if(buf.packet_cout != count_copy)
3 I+ t. R4 R& C: D        {
+ W; u  n! {; E7 |                printf("a is %d\n", buf.a);; a+ h$ q% h5 l& g" G
                printf("b is %d\n", buf.b);/ f" N! O4 M" f4 D4 |* S
                printf("count is %d\n", buf.packet_cout);
+ s4 k$ V8 j8 a$ L                count_copy = buf.packet_cout;1 b; O3 P8 \/ O6 j: c6 b6 I6 h( f' c
        }
4 R- R0 Y1 R; |- I        else6 b+ p  |/ q/ B, t0 z% B3 f$ G* a+ X
        {
, a) i/ Z! X6 \8 c) s' |# {0 `; h                printf("No effective message!");" e9 z6 K$ L& I' l
        }1 t5 k9 X9 B, w, R% f/ K0 x! t& U
}
1 y) k5 s% h* b* n% N0 }( g' T
) y8 M! o; P6 B% q' _3 t6 G! |7 B9 C& P% l2 e* R! K5 _6 T* O. D
但是出现segmentation fault的问题,这是什么原因啊???我在DSP端烧写了一段小程序,向共享区0x80000000位置写入数据,用CCS 测试发现写入成功。
& k# d8 m6 _8 J4 ^- r1 }: k使用下面代码,对内存使用了mmap函数后:* E, g2 U- V  ?3 n2 L
#include <stdio.h>0 U2 v0 l1 Y/ h
#include <unistd.h>
  I. `3 l+ o2 ?% g2 o#include <sys/mman.h>/ c& \; E3 D+ {. o
#include <sys/types.h>* T: O/ B/ S: ~8 G* [- n3 r
#include <fcntl.h>
7 ~7 {3 f8 B; X" G" a* _1 }! z2 C7 z5 B# w" ~$ `: I/ W
#define SHAER_RAM_BASE_ADDR    (0x80000000)5 M- Y7 x0 Q. F8 |$ x' l! r5 _
#define SHAER_RAM_SIZE         (0x20000)   ' s# n/ T8 G0 L! \

  s( A/ O" V+ t3 U) H: utypedef struct
; _- E# A; ]+ y9 O$ Y5 r: }{
( M2 `7 l  K) _9 V3 c        unsigned int a;' }. Y1 H' v! o/ \3 k7 |
        unsigned int b;+ v( ~1 }5 `* M% l5 ~
        unsigned int packet_cout;
! I  z/ M1 Z# M# b}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;2 m- m. q! T- o) y' p* j) r
0 W5 n; m# V  V5 u' Q
void read_MSG_buffer(int *baseaddr);; Q+ q. ^/ W' J' s% x* l# T
unsigned int count_copy = 0;. X3 ?3 z8 z2 @) W! E% W# r
9 V  o& Q$ o( {( m+ Q# T
int main()- A- r* Z6 A6 X: S% x" C! E  _
{+ ^) L# ~" J6 d, X
        int fd;  M* T, }( N0 O. v; r0 z2 l
        int *mem = NULL;0 K) D; Z  ?, A* S& z

% U" o! d1 z- h; l+ w        if((fd = open("/dev/mem", O_RDWR)) <0)
5 F( R/ O' v( `* l- W        {
: }- D* v% g% y1 N3 W                perror("open error");
0 e; [  Q9 x3 O; H                return -1;9 _, H$ L# s2 j% k' e0 c3 M
        }3 O2 v' d4 g, m0 r" }7 w6 b
        & f6 j. _: k( S$ |% z& Y
        mem = mmap((void *)SHAER_RAM_BASE_ADDR, SHAER_RAM_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);
1 _( m/ `$ |" D7 h4 x
- n, D) @8 j( k3 h2 b( X        while(1)
, X/ _" R7 a$ U' k        {+ ~1 H; R! F% h! M: z
                read_MSG_buffer(mem);
! I9 i- _) l9 m        }                7 y6 o# X+ Q0 h7 R/ O% Y. }) o
}# `  C% o: K0 z/ c9 h0 A

! |! D, ?' F% Ovoid read_MSG_buffer(int *baseaddr)
; f/ Q) ^- S- d  v8 A* I( B/ J{
  e% D9 o4 q, h        pRX_MSG_PROTOCOL pshreRAM = NULL;
3 L$ s% n$ ]+ {* j2 v% \. ?$ j- |( }# H4 G/ [" x) E
        pshreRAM = (pRX_MSG_PROTOCOL)baseaddr;
* {" M* V2 ~! l, I8 I  \
2 t2 @. j0 Q3 ?- `& s* `        if(pshreRAM->packet_cout != count_copy)$ e0 `! S9 O2 B1 M
        {
6 U4 ^" ^) F. {& F, x; O4 E                printf("a is %d\n", pshreRAM->a);5 v& t: _8 C1 D. L$ w: ~
                printf("b is %d\n", pshreRAM->b);
1 W( V6 [4 Q. }& b  I: M; c5 V                printf("count is %d\n", pshreRAM->packet_cout);9 l7 _) Z" H9 n8 x8 b  X  I8 P
                count_copy = pshreRAM->packet_cout;
0 ~! t5 l) [# }. \6 ^        }% G' t4 [: y: S
        else" e! Y% Q( ^  j+ c' ~
        {
7 ?# E+ J3 g) x' }2 T. j                printf("No effective message!\n");4 E: c3 v6 x  Z' ?$ N, v5 p% V
        }0 ]& i0 m% k: H: K
}$ Z; }% Y: }" Z; N+ i
+ S% q* X3 X' {, L; z" M/ F3 J
没有出现segmentation fault这个错误,但是读出来的数据均为0。这该怎样解决啊???主要问题还是在Linux系统下,OMAPL138是否可以直接访问映射地址???该怎样实现???
: h, ]& @/ h1 q0 k
* M0 I5 ~* r9 L4 W4 d$ }+ h
; t* I* R; }( C' |
" }* V: z. }% T- s
* N% K" o9 s% z, k+ }4 z: `
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-12-2 12:56 , Processed in 0.041233 second(s), 27 queries .

Powered by Discuz! X3.2

© 2001-2015 Comsenz Inc.

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