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

嵌入式开发者社区

 找回密码
 立即注册

QQ登录

只需一步,快速开始

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

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

[复制链接]

5

主题

6

帖子

51

积分

注册会员

Rank: 2

积分
51
跳转到指定楼层
楼主
发表于 2014-8-19 16:38:00 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 zc_fly 于 2014-8-19 16:53 编辑 % N- k' S3 w( l' U5 r/ @+ t- u, B% u
# P* H$ l" Y' Z5 T
OMAPL138的ARM端对共享区内存进行直接访问,代码如下所示:#include <stdio.h>
7 _5 Z6 D9 S8 }3 `* a9 q/ {#include <unistd.h>
8 W* ?5 H9 b0 y: S#include <sys/mman.h>
7 v& y: |" m/ j' O6 C#include <sys/types.h>9 @1 L; n) D5 B  I
#include <fcntl.h>
% t# b% m( ]3 T: s, n. |! J: y* Q9 x  @% T5 M* X. F
#define SHAER_RAM_BASE_ADDR    (0x80000000)   2 X7 z4 r( `: p1 o2 a5 J! l6 `
. @) N$ _" e: g% b0 Z
typedef struct- I9 N4 l; v0 R# C
{) F. i  }" H! v" Y+ R) c# B
        unsigned int a;
# c  ~  H% p- T2 q. G3 E        unsigned int b;% X: R+ g. e* v) c
        unsigned int packet_cout;
8 V1 N, S& h& ^}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
5 r; e% |5 p( ^2 h1 g$ E8 g, M  V3 u- v! V6 p
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM);) V) n& q9 [7 E5 V
unsigned int count_copy = 0;7 ?- F9 h5 q% C, y

$ _4 [. f6 K, ^+ r' z( h3 l, W" r5 h4 T9 a, ]1 r
int main()
- y( R/ D! K" Q) e* ^) Q& n{3 C) H- g! O2 O/ v
        pRX_MSG_PROTOCOL pshreRAM = NULL;/ y8 g/ W: ], \. K/ d7 C2 O( }
        pshreRAM = (pRX_MSG_PROTOCOL)SHAER_RAM_BASE_ADDR;
- ~0 E8 u' [9 B
' t- q! e! h" L/ K) q- J        while(1)
7 ~* ~9 o: l5 X  M  L# e5 V; C" W        {
, Y, a& `+ c3 @- J                read_MSG_buffer(pshreRAM);
3 K$ p3 k# E8 I3 g* @0 l' f! ?3 H        }                % u' B+ j2 _) p, Y7 z& y4 q
}* c  i* h3 |' @, A/ c9 C

6 [+ |# ~$ ?; ]& g0 N' lvoid read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM)
0 g, G. T" l2 C( q9 y{
3 K4 R( C" ^% |* `+ t        RX_MSG_PROTOCOL buf;( R* @1 n  X; g$ I% `. S8 w
        6 P0 L2 U  l& R
        buf.a = pshreRAM->a;
. R; Y" b. b$ Q% K1 Z        buf.b = pshreRAM->b;
* T4 B# }. i/ X/ d% [+ Z        buf.packet_cout = pshreRAM->packet_cout;
* g* i+ G9 s9 L        6 q# e9 D# v$ s( q& V( ^
        if(buf.packet_cout != count_copy)4 V% ^  V# \: b- i) Q: ]7 P
        {" N! Y2 A, G2 m+ o  Y( e
                printf("a is %d\n", buf.a);  h. P, M& R. X# @( k# X
                printf("b is %d\n", buf.b);) q* [# P  C0 B4 m" k5 j
                printf("count is %d\n", buf.packet_cout);
8 m6 y& g" J  n                count_copy = buf.packet_cout;
. p' {3 W- F) r* W# A' O9 @% b        }
9 N+ O5 x. ]: |! W5 ^/ u/ K! D2 j. k        else
3 A( f5 {2 B) u3 d4 r) b, l        {
4 T9 W( O0 H$ {9 ^                printf("No effective message!");8 Z( {; L& v. O( ^2 @% m
        }) }. c% f$ T$ c# h+ U
}
& Q! ~5 k, y4 c( J; B9 S& a: i: }0 I$ Q2 ^

9 n! j* H9 g- k7 L1 I但是出现segmentation fault的问题,这是什么原因啊???我在DSP端烧写了一段小程序,向共享区0x80000000位置写入数据,用CCS 测试发现写入成功。
. r, g% A. `% F( H' c使用下面代码,对内存使用了mmap函数后:
" e6 ], x, W% s' y! |, a% e" E#include <stdio.h>
) s5 j) [; \9 o' t# x, S#include <unistd.h>
8 ~2 w  P9 y) J4 M% P' q#include <sys/mman.h>8 p: o* {! m' G5 Z0 e# Q3 H. _: u
#include <sys/types.h>% i2 C% Q& G( C# ?
#include <fcntl.h>9 y% e6 \! Y2 e; Z4 D% e4 u8 \

; q6 s1 H" p5 u( C2 U" _) B7 H2 x# V#define SHAER_RAM_BASE_ADDR    (0x80000000)3 _# I+ |" E3 r) t. j  R# M
#define SHAER_RAM_SIZE         (0x20000)   5 w  h( b) R* o* _+ `0 g$ k
! _. x$ I$ u, T: @1 S$ A
typedef struct
3 _' g- V9 j. S: [( E6 ^. v/ }5 v8 m{
: I. G5 f! K* U6 h0 G6 F: G3 ]        unsigned int a;
  x+ L4 Q% O% s# t- e8 Q        unsigned int b;$ s2 g& e* V2 ]8 @
        unsigned int packet_cout;! F3 Y9 ^; S2 U, @2 s# l
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;& u  r8 f  U: j% H

: q" d; X. t( v% v2 n, A7 Wvoid read_MSG_buffer(int *baseaddr);# k5 @- D3 I( ~. O* u( j
unsigned int count_copy = 0;! i9 p% Q) |2 p) @* {
; u, W+ D3 c8 I3 x
int main()
2 U5 a" M: a, R  f$ r% I% B! W1 T{
' {& V' y- T9 c$ Y7 M% D4 z        int fd;
! n+ r; u$ E3 v; z; [8 `        int *mem = NULL;* ?$ F0 b$ y6 X0 L3 P( X
1 o9 b' N2 P! l! n' u4 @! g
        if((fd = open("/dev/mem", O_RDWR)) <0)
& B( w3 a9 Z" X8 h2 x+ `! F" ]        {
0 y  j6 i( t/ [, _. \- d                perror("open error");
7 o6 c$ X/ [7 G                return -1;
( s' r: `3 x) H- r1 T2 T3 Z& Z        }; J. E) Q4 G# ?1 v
        
7 I" p2 D9 G( e0 z; e; M        mem = mmap((void *)SHAER_RAM_BASE_ADDR, SHAER_RAM_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);- \, ~/ `2 m8 F) X" l! q

/ Z) }4 p- n4 L) K0 Y        while(1)
% C9 h0 Y5 D  h        {
5 E% V& b& e. q% w3 a  U                read_MSG_buffer(mem);
& u' D5 N' l  H* ^1 Z2 p        }               
1 q) L: ?+ y0 S, f& q5 _( {* Q}
2 w7 J6 @4 C- g2 V+ H. ^
( w4 Y" V" ]& Z5 kvoid read_MSG_buffer(int *baseaddr)6 b8 r9 e/ {& C: y" c5 s- o
{
3 i2 A7 L' C9 C9 l" F; n7 F        pRX_MSG_PROTOCOL pshreRAM = NULL;
1 R1 ]# [/ D9 `, a2 \1 ]3 I3 _! Q% o5 d( I2 e- @0 I
        pshreRAM = (pRX_MSG_PROTOCOL)baseaddr;9 l4 c9 R3 {9 J/ G
* t' n' q) L3 H7 x/ p0 y0 r* q
        if(pshreRAM->packet_cout != count_copy)
3 K6 _2 x3 V8 Z% ^  ?) k. A        {' X) ~9 |' `. D
                printf("a is %d\n", pshreRAM->a);2 Q/ `5 g: b) z8 y( ]. `
                printf("b is %d\n", pshreRAM->b);6 @' v/ @, y8 q- D+ g% S
                printf("count is %d\n", pshreRAM->packet_cout);+ l- w5 k! G$ i! `5 s+ b
                count_copy = pshreRAM->packet_cout;6 _; Y1 ~1 X3 o% g
        }
6 M2 a. g% x! }* ~6 `7 a        else
2 I0 y% `% x! x- ~# M, x8 A        {6 J+ t# _4 a. b7 w+ A
                printf("No effective message!\n");: ~- g  Q" s6 `7 f  T
        }0 {6 W1 k$ T/ e' c1 i- r  J( i
}
) a2 P# Z% J% H6 ~% y, d1 o* e6 @* @
" ?* M6 O$ f8 z1 }! x/ h8 a没有出现segmentation fault这个错误,但是读出来的数据均为0。这该怎样解决啊???主要问题还是在Linux系统下,OMAPL138是否可以直接访问映射地址???该怎样实现???
. s: S2 a( |! t- r( h! N
. i9 n8 ?: x9 \0 R
5 c3 I! b9 V0 G
/ ~7 F! ?! ]2 N/ W0 V6 N5 a! j2 d5 R6 M' r1 M# B9 L5 v
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖
回复

使用道具 举报

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

本版积分规则

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

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

GMT+8, 2026-3-20 05:36 , Processed in 0.040665 second(s), 25 queries .

Powered by Discuz! X3.2

© 2001-2015 Comsenz Inc.

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