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

嵌入式开发者社区

 找回密码
 立即注册

QQ登录

只需一步,快速开始

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

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

[复制链接]

5

主题

6

帖子

51

积分

注册会员

Rank: 2

积分
51
跳转到指定楼层
楼主
发表于 2014-8-19 16:38:00 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 zc_fly 于 2014-8-19 16:53 编辑
: P+ R. G. ~. w# E" P0 V# C% ~& I1 E: C3 e% o3 n
OMAPL138的ARM端对共享区内存进行直接访问,代码如下所示:#include <stdio.h>, E' l% U. ~# F' Y( X
#include <unistd.h>
* ]  {9 `3 F  J- ^' P. G: I#include <sys/mman.h>2 Q% Y4 Z6 I, R
#include <sys/types.h>
( \5 E5 H; H5 M0 w$ N3 r% x6 H#include <fcntl.h>
1 |) z. T0 `" t+ y% B- a% w, M# `, z* m8 o% h- c: B$ d
#define SHAER_RAM_BASE_ADDR    (0x80000000)   
% K; J; u4 W/ p6 |. ?
: O' W4 S; V3 j) a5 p0 p- |6 I! Ptypedef struct4 U' d- v4 p( v0 }! j
{! n0 I0 _% R, l: I) x( q) @0 G
        unsigned int a;
6 Y9 i, A3 I" S! O- V# r        unsigned int b;8 D2 r1 S! E+ k
        unsigned int packet_cout;
- S8 v9 s% |; }5 L2 ?+ Z7 h) S+ x' O}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;( X% B) u0 B( G, J9 `
5 V9 _4 ~7 q3 [! m: y3 Q
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM);
. |6 k8 f+ A1 U* H. Uunsigned int count_copy = 0;0 C" |( L7 I3 q$ Y* @9 n

& E9 y) |  L! h! K8 q
7 Q. x  l  M7 k- f+ c' L* Fint main()
6 v: [% s' X0 ]0 E{
7 r) c) \  x8 r+ P  J  B# M* S8 n        pRX_MSG_PROTOCOL pshreRAM = NULL;
! W+ }# O6 d' s# [# r        pshreRAM = (pRX_MSG_PROTOCOL)SHAER_RAM_BASE_ADDR;
( Q- _4 p* A3 v3 ]! F6 x9 j3 g* U( A; g  Y2 u
        while(1)
2 b  V4 a( @: r6 s        {
1 h/ ]6 S+ m  [) H% H                read_MSG_buffer(pshreRAM);
& |# K% u/ \; J5 M        }                $ K) u, m8 E: i1 d
}4 k' d* R, c" H1 D) O7 t

; R, r# S8 F" Mvoid read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM)
7 g3 i$ z! i4 n{
& \! w0 }9 d' h7 K$ r% s) ], B! i        RX_MSG_PROTOCOL buf;
, X; f) T7 X) f. u3 |6 j# K        
0 H# }- ?+ i  J& L) m0 r- X        buf.a = pshreRAM->a;1 c1 j* L3 x" f
        buf.b = pshreRAM->b;
0 _) ]  D; G+ B4 ]        buf.packet_cout = pshreRAM->packet_cout;2 h, o" u( W5 o( R- W
        7 E0 }5 {  ~) a% k* ~& i; C
        if(buf.packet_cout != count_copy)
+ Q% s0 o& U2 m( Z3 W0 R+ X% H; x, ]/ W        {
) v# {1 w* @/ N/ m- l% Y/ X, @                printf("a is %d\n", buf.a);
5 \( ]3 `3 P' ?' V6 E+ X: h' Z: E3 K                printf("b is %d\n", buf.b);4 @2 \5 {% c8 ~) @
                printf("count is %d\n", buf.packet_cout);
) H/ i9 R3 m/ k: X/ u8 ^                count_copy = buf.packet_cout;" c1 [( a2 G0 x# @/ X% G
        }) Y/ x% `8 ?. `" u0 R, }7 H" B
        else/ w5 I9 U- M2 r
        {3 v5 N2 T, n4 q8 |5 S
                printf("No effective message!");. J  ^3 I& r. N
        }
: D% ?3 v9 G  _6 B3 Y9 ?}( S4 c! J" ~* c1 `% Z

- J, a4 F4 f  T( R) s
6 u( m, B+ Z( p# ]5 a但是出现segmentation fault的问题,这是什么原因啊???我在DSP端烧写了一段小程序,向共享区0x80000000位置写入数据,用CCS 测试发现写入成功。' W: q# P1 v: X. }3 W
使用下面代码,对内存使用了mmap函数后:
& P8 e" A' d, k#include <stdio.h>( P1 d6 V+ a+ I# L$ v
#include <unistd.h>
7 A- ]" O8 l/ @$ v- j#include <sys/mman.h>
- A$ l) U& ^) y1 V  P' w. c9 y# M3 G#include <sys/types.h>& d/ ^+ F! F$ O2 n$ M) j2 g; u! ~
#include <fcntl.h>; q  i4 L/ `6 y9 e6 @) O

, o8 c& m& [3 s. m#define SHAER_RAM_BASE_ADDR    (0x80000000)
0 a# a# [0 m! s) K1 J2 s#define SHAER_RAM_SIZE         (0x20000)   
' z+ \4 f! q% |# [3 _$ G1 b( E
typedef struct
& C: }( N! Z5 [* z+ d# u8 h{
, v, g, a8 Z& E$ z- d        unsigned int a;
; E7 f1 R  _! \1 Y        unsigned int b;' ]3 w  R4 P( t: `4 ^2 z$ _, ~
        unsigned int packet_cout;# _% O2 e# c( n' Z8 s
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;* O0 q3 @& d* G4 X0 y' |1 |
9 t/ E- [! E# o) o! v# n9 I' i4 h, Z7 s
void read_MSG_buffer(int *baseaddr);2 W/ J2 E3 d) W% {2 s. x+ J
unsigned int count_copy = 0;
1 m! x: |6 A# d
  E, q3 h( y& z6 P4 e( ]0 X0 gint main()( h: }0 z" F. U1 E" J' s7 s
{
% N0 M$ m; w& S+ x( K. q        int fd;  I. x/ g! v# {& k
        int *mem = NULL;
9 ?' f7 {. P5 p8 K5 P0 \! f% Z; v3 r2 ]: e
        if((fd = open("/dev/mem", O_RDWR)) <0)8 Y4 m) B: L5 a8 \
        {; I2 A8 f% q% `' H1 j
                perror("open error");
- F. d3 s- V3 {3 E) u/ W                return -1;. U3 p* c4 O  ^1 K* l
        }
( ]5 l% C: V. X$ t6 j9 r" X- ]        + Z2 Q1 S9 N9 [2 D
        mem = mmap((void *)SHAER_RAM_BASE_ADDR, SHAER_RAM_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);' y; L6 f/ T0 U/ Y
2 o- J! U+ U$ ~$ g4 h
        while(1)
8 z: R1 Z# W, L2 \; m8 @3 m        {
+ R0 _4 ?' ?9 v5 G" r7 s! m                read_MSG_buffer(mem);. d  u& ~, T1 G- H8 X
        }                . v" |+ o! _* M" p6 v- f
}1 [( A& c- k2 H. z, |

- p. ^4 ~. m1 s: Vvoid read_MSG_buffer(int *baseaddr)
  S. m8 P  D! R7 g( D, ]{
" ^) g  Z$ g0 H* z! m1 C        pRX_MSG_PROTOCOL pshreRAM = NULL;+ |5 N" A) b% T" k2 i
  s# C% W& d0 w* T" l: D- |
        pshreRAM = (pRX_MSG_PROTOCOL)baseaddr;/ n/ m8 B4 ?' Q5 j
+ S; v2 F- C4 Y8 Y: u, q8 k
        if(pshreRAM->packet_cout != count_copy)
8 B( J2 c. d6 M% K0 V4 D- }        {4 ^+ ^- [/ O% i9 J" @# K2 N- ^
                printf("a is %d\n", pshreRAM->a);
1 p! X) |: d) h2 y6 s, D9 H                printf("b is %d\n", pshreRAM->b);
4 l) A7 n9 Q2 M, x2 C  N                printf("count is %d\n", pshreRAM->packet_cout);: m& s1 j/ f  F  I" k1 @
                count_copy = pshreRAM->packet_cout;/ e+ J' Y7 |2 F! o) H' `; U! M
        }# G4 ?/ u( U" Y+ y
        else0 s0 p% Z; @4 Q7 f) X
        {
# d2 G6 l" c: L/ B$ H6 j/ r6 H                printf("No effective message!\n");, e3 N$ F* g( `- x( E
        }6 K+ @5 T5 e( H9 u$ E
}! Q' T7 s6 u" M$ N

) y$ C3 C6 D6 S  M. N3 K4 S没有出现segmentation fault这个错误,但是读出来的数据均为0。这该怎样解决啊???主要问题还是在Linux系统下,OMAPL138是否可以直接访问映射地址???该怎样实现???
) g4 {* Y# \  V9 Y6 }  W1 V! y. _" u9 T2 ]) y

% W% ~! l* P, {* k8 C6 U0 [1 I
+ ]3 K; l7 p0 j3 }4 b$ Z; Z  {2 Y( c
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖
回复

使用道具 举报

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

本版积分规则

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

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

GMT+8, 2026-3-11 07:14 , Processed in 0.048134 second(s), 26 queries .

Powered by Discuz! X3.2

© 2001-2015 Comsenz Inc.

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