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

嵌入式开发者社区

 找回密码
 立即注册

QQ登录

只需一步,快速开始

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

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

[复制链接]

5

主题

6

帖子

51

积分

注册会员

Rank: 2

积分
51
跳转到指定楼层
楼主
发表于 2014-8-19 16:38:00 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 zc_fly 于 2014-8-19 16:53 编辑
% {& Y9 y' p1 h: J6 Z6 n
2 g( V- T4 M/ i) [! n0 ]' jOMAPL138的ARM端对共享区内存进行直接访问,代码如下所示:#include <stdio.h>; ]0 N6 f$ q' G- x' U
#include <unistd.h>+ C# {$ P8 o7 h+ U* q
#include <sys/mman.h>
! Y0 j/ Y5 g" B$ X/ o0 _#include <sys/types.h># H2 k9 t& W' `
#include <fcntl.h>/ Y* S5 f4 ?# M! G( ^0 A4 `4 h7 Y
( y5 P" \/ M' K% e/ I, Z3 z
#define SHAER_RAM_BASE_ADDR    (0x80000000)   
& i: h" S% f' x6 e& p! B4 w
; w( ?" `9 K1 V8 v8 ]4 i9 H% Btypedef struct, M  q# o7 n' \; F- Q
{" r. A1 m( S4 Z. `" J: _' A
        unsigned int a;
+ r- c0 R+ r% d6 C% _2 X        unsigned int b;
' T0 `- u* c" x& x, Z" `+ C        unsigned int packet_cout;+ u! ?9 a' x( s! `/ o$ k( |: A" J
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;( n/ @0 @" `: X- f! Z% z

' f4 V* z1 Y$ T& K3 o7 H# hvoid read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM);
, `0 C2 p4 D5 V. g+ yunsigned int count_copy = 0;7 c1 Z/ N; G5 c8 Q* ^6 a
6 A: J& q" `) P6 ?2 ^2 j' C8 @, W/ A

% @9 R: q: K* q1 _9 J  p, S; [int main()
# o" \( U% S8 e0 D{( s7 g" e5 j: B$ y3 F/ ?
        pRX_MSG_PROTOCOL pshreRAM = NULL;- S" P+ _% \! M: e
        pshreRAM = (pRX_MSG_PROTOCOL)SHAER_RAM_BASE_ADDR;
! f3 K1 ]3 Q1 ^  J6 A. ?0 n+ X! W' {- s7 X; Z2 m
        while(1)& |# n% J0 N3 L$ l5 Z- @
        {0 d7 G# |2 h& \2 b9 L8 }6 f
                read_MSG_buffer(pshreRAM);
8 Y2 s. R1 [5 m) R+ Y, D" @        }               
) X% d: _  Y/ e' j}
* d2 p4 r/ D. q1 p4 u; p0 A  p; E/ }- O' T
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM)
5 a0 R) N! W; [& H  S{
; \8 d8 D& ?$ M8 ^$ o# y, V        RX_MSG_PROTOCOL buf;7 v3 Z; j: e2 W! s* a! S
        : m/ R2 k/ ], D  A0 Z
        buf.a = pshreRAM->a;* V: j) t+ Z4 E
        buf.b = pshreRAM->b;9 @+ b8 P4 v  r& U- y
        buf.packet_cout = pshreRAM->packet_cout;
0 V9 k/ i; T6 u* x) Q+ p        
! e' X; d  k: g6 G* a        if(buf.packet_cout != count_copy)
) T6 H) c- w0 V) i        {+ u8 B% R& U; c" d- Y
                printf("a is %d\n", buf.a);
% D% g" n, H$ c8 I. P3 m6 p                printf("b is %d\n", buf.b);# v) _8 o2 Z3 h+ h8 ]) l
                printf("count is %d\n", buf.packet_cout);. Y( k, [0 j5 ^+ f
                count_copy = buf.packet_cout;
7 R  }0 P8 ~1 w! a: e5 Z        }- C' P/ F# d0 S
        else$ n9 p" u1 I( t- f7 }
        {  w# k2 e5 o$ y
                printf("No effective message!");
( a' x6 U5 \% O        }
/ a; I4 Y9 q( f}
! t! M8 p5 r$ \, W; P; _+ j
* Y, s# W3 L7 ^& E6 u1 C, l
& l5 V6 _) p3 T& x4 j; d但是出现segmentation fault的问题,这是什么原因啊???我在DSP端烧写了一段小程序,向共享区0x80000000位置写入数据,用CCS 测试发现写入成功。
7 g" J5 W' c- n# b6 h使用下面代码,对内存使用了mmap函数后:
7 T9 R+ n( \# f5 x3 J#include <stdio.h>/ b- W. h3 C/ `9 k' G0 s) x
#include <unistd.h>9 T. s9 q  `) s' S% N6 }5 M
#include <sys/mman.h>
+ X+ N' ]7 V5 F% I#include <sys/types.h>% O0 |' \! D$ l1 g* H+ a; p
#include <fcntl.h>/ o# D; F  ?5 L: B5 P
  ]. M) w; Z* C, v
#define SHAER_RAM_BASE_ADDR    (0x80000000)
* B# z) X$ D2 h" d( w#define SHAER_RAM_SIZE         (0x20000)   
1 _9 P( r5 Y0 s6 p7 e( L, U4 q4 k8 r: L( g* Z, D$ `% z) t8 w
typedef struct
+ F9 a& J, _  W% X{
0 b5 c. S6 Q3 _5 ^        unsigned int a;
' a/ R  T1 m& }2 h: X3 }        unsigned int b;8 U5 ]; I+ n/ S, i6 M
        unsigned int packet_cout;% i6 X( {9 ?( s
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;" i1 Z' L& C. L9 {
# a' H8 X( D- h+ Z. `5 I6 _5 y0 D1 |
void read_MSG_buffer(int *baseaddr);9 [! |. t6 Q/ N* A- z: ]
unsigned int count_copy = 0;
+ T' E. K1 L) S- i4 o# w& Q& P
5 O* W" n% S9 \int main()% ]$ @. T. S8 x: K7 r( o+ \
{
) A: a9 |+ K; g# R8 c        int fd;1 l; g  {8 i4 E9 ]
        int *mem = NULL;' S; b& r! n1 }# k9 F$ D
/ f1 F- v8 a/ x" Y3 B& E* F5 Y
        if((fd = open("/dev/mem", O_RDWR)) <0)
1 f1 G& h" R9 }. X& S1 f        {7 |. Y/ `3 Q: j  Q& |3 c7 X( s) g, B9 X
                perror("open error");6 @# D7 r0 C& p: k" T8 H. b
                return -1;0 a7 J7 N$ a# V! o" i, r* m
        }
6 d; b. x, \! ]! }; K6 d4 m        7 c9 t# r, F4 S: b) E: |/ E3 F
        mem = mmap((void *)SHAER_RAM_BASE_ADDR, SHAER_RAM_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);3 c; f/ K8 Y# D# c- o

" D( s9 {9 F, Z5 H: V2 p% W* o        while(1)
; }; \! T, ~; [/ l        {. A# N5 f# t. u' Q) ?3 F3 Q& G
                read_MSG_buffer(mem);
- z# Q4 Q% N: W$ C; e! V        }               
2 G2 f+ c4 I6 R7 z3 V6 @}
/ U% d) @4 p" i& ^# }  O  A+ [4 r4 C  h+ z: E) t
void read_MSG_buffer(int *baseaddr)
& L9 j! z+ K6 d+ ]) f{9 T9 o3 l- e* _
        pRX_MSG_PROTOCOL pshreRAM = NULL;! N4 w# B1 G+ r) {2 f

0 t# @& [* m+ ]) _        pshreRAM = (pRX_MSG_PROTOCOL)baseaddr;* a+ ~& n2 X& x2 I% l# c
1 M- B2 b5 w- `3 r% w! F8 R
        if(pshreRAM->packet_cout != count_copy)
# w6 J, g8 A( V  |/ s        {- j* K( ]' j8 s# G- `
                printf("a is %d\n", pshreRAM->a);
! V, I& n. v: A1 Q                printf("b is %d\n", pshreRAM->b);/ G, v! \3 Z# I$ ^. E% w
                printf("count is %d\n", pshreRAM->packet_cout);
* E+ K: Y! d7 A6 m5 U  X. `                count_copy = pshreRAM->packet_cout;
7 n4 p6 g8 V8 H# W- g8 g6 X        }
, C2 O9 {. j9 Z$ O. k/ l0 Q5 ~        else
1 B: a4 w8 \; `  l        {
8 _8 R! L0 [( v* Z5 d! p4 Z                printf("No effective message!\n");2 K/ n2 A$ I6 |) u  r3 Q% F9 H! P
        }; K% w- O( o9 q0 C. i" w
}
7 O  k5 D" k/ B3 q
7 N3 c% c" Y( n没有出现segmentation fault这个错误,但是读出来的数据均为0。这该怎样解决啊???主要问题还是在Linux系统下,OMAPL138是否可以直接访问映射地址???该怎样实现???
3 a2 @$ J9 Y+ [6 k0 R) J. L0 R8 c; N/ J

9 e1 m; i) w& N6 s! ]
8 l* y; y$ j; d! B8 u
9 }6 k2 T, \' G
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖
回复

使用道具 举报

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

本版积分规则

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

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

GMT+8, 2026-3-14 06:50 , Processed in 0.056475 second(s), 26 queries .

Powered by Discuz! X3.2

© 2001-2015 Comsenz Inc.

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