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

嵌入式开发者社区

 找回密码
 立即注册

QQ登录

只需一步,快速开始

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

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

[复制链接]

5

主题

6

帖子

51

积分

注册会员

Rank: 2

积分
51
跳转到指定楼层
楼主
发表于 2014-8-19 16:38:00 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 zc_fly 于 2014-8-19 16:53 编辑
6 ]0 a6 r# @0 H" \
: T, w$ ^! R# v: f+ L1 _# X. OOMAPL138的ARM端对共享区内存进行直接访问,代码如下所示:#include <stdio.h>
* F' ^1 A. O1 z7 s* k  A- _* Q. p#include <unistd.h>
; n! W5 ?* w2 \; i* ]#include <sys/mman.h>4 s, \. O8 n1 D
#include <sys/types.h>* Z- u; K" R$ M6 s2 ]' }
#include <fcntl.h>, j0 L# h8 R& Q1 e: f

* _/ W4 S* K7 }6 `#define SHAER_RAM_BASE_ADDR    (0x80000000)   - X2 F& y/ |; P3 G, a1 W' F
" k& e7 I0 Z5 ^( L. F
typedef struct# \& y, h+ H# M& w/ O
{
$ B9 |8 K$ i' L5 Q/ v- S8 A        unsigned int a;
3 ~6 x% j2 n: [/ v2 u        unsigned int b;( k* l; V1 g  |9 Y2 ^
        unsigned int packet_cout;3 n; \, I$ ]% Y' D1 j. E& ~
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
" n  k% c5 T& z" P* Q9 I1 L1 J( M" W" ?, A
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM);
6 o% i4 @2 `  K; d. Runsigned int count_copy = 0;9 J. j, Y; |1 X4 A) f

$ P" n. f* T" g  F. o( L# z; x! t! J8 P
int main()' _( P2 x4 B/ C; N8 c. W
{( [6 f( a! R& \' H, s
        pRX_MSG_PROTOCOL pshreRAM = NULL;( S/ I) w+ R- U. o/ ]
        pshreRAM = (pRX_MSG_PROTOCOL)SHAER_RAM_BASE_ADDR;+ G, T7 H7 n# o1 k) V: }! s" W
, J. ~6 `9 C/ m; L. W& |; a2 H
        while(1)
$ {* x! n8 ^2 f9 Q/ N4 W/ o  x        {
( M0 V" U7 m" U                read_MSG_buffer(pshreRAM);  a# J& o5 `$ ]4 b7 V4 y9 Z  \. \
        }               
* z" F: x* y7 {9 i5 p8 |1 n  V5 k( Q}- l# }/ L4 l+ z) G1 _+ r

% I+ `0 _! l- S* ]. q$ x. Avoid read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM)& S$ T; u  c! z2 X) f' B7 O2 k$ M
{  v1 ?4 s8 w6 n
        RX_MSG_PROTOCOL buf;
2 ?  O& R8 ~8 R. h; R( N        $ E) n# ^9 L$ d6 S4 [& X( M- g
        buf.a = pshreRAM->a;
9 B& p, x, }5 Z! ]' k$ {" ~        buf.b = pshreRAM->b;5 W+ M- X6 m2 M8 g9 Q. ^' R3 d
        buf.packet_cout = pshreRAM->packet_cout;
# V; N+ p! B0 {' }        % H+ B( b$ d$ p) y; _8 D! V
        if(buf.packet_cout != count_copy)
, h* M0 R0 @/ O- W8 u        {$ f: x  S1 N. D9 E5 P9 n
                printf("a is %d\n", buf.a);
3 t. `# G- m4 G  U; z# Y                printf("b is %d\n", buf.b);5 m3 X8 f9 T$ O" V, E" E+ s; g* {9 [
                printf("count is %d\n", buf.packet_cout);
: U0 m; g( Y' b. k  ]: u                count_copy = buf.packet_cout;
  r0 H4 Q: u0 g$ G" J        }! b5 {3 H" J5 ^7 t) B: a
        else
5 W$ p! p% l/ B1 c7 t) s' }        {9 A3 ]- S+ P* E* {) ?3 |$ M" u
                printf("No effective message!");
, e# u- X  d( b% ~2 q+ ^+ O        }
& _6 b! Z* R! Z1 u% O" N, `}' J, `" `7 w4 P) t0 ~
6 U. Z. m; V; r$ t1 ^4 f

* h! `& W0 e5 M; o: @( G  {: u0 |但是出现segmentation fault的问题,这是什么原因啊???我在DSP端烧写了一段小程序,向共享区0x80000000位置写入数据,用CCS 测试发现写入成功。
! h: y+ k! ~: K; J使用下面代码,对内存使用了mmap函数后:
1 W: Y4 I' K  {#include <stdio.h>
8 z) [7 N3 N; x1 I4 g/ }& X; {#include <unistd.h>- s# r; O! N0 u8 z! t, {8 M
#include <sys/mman.h>
/ e+ a! z. y# I. Y! U#include <sys/types.h>9 h+ g  f. M6 N# M, v" S# Y7 |
#include <fcntl.h>
+ A" n+ O3 I2 L; u- L& ^& B. Y$ V( J' m3 ?( E  k1 {
#define SHAER_RAM_BASE_ADDR    (0x80000000)
2 W# W+ ?* E* U#define SHAER_RAM_SIZE         (0x20000)   " f/ I  m8 \3 L9 ^

5 |8 N+ C0 K6 g, B; }typedef struct
# {# Z9 x  n/ s{% y3 T7 E. z6 a8 j
        unsigned int a;; n* A) S# F5 j
        unsigned int b;" P4 E: i4 Q9 V0 n  A
        unsigned int packet_cout;
* B9 F' X4 ?5 Q& ~: E9 j& P& R}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;9 {0 W7 p! z: g! D4 a; t" g* }8 L8 A

# X8 H; A: w! d3 ovoid read_MSG_buffer(int *baseaddr);2 D; {. G3 U( u* {0 a5 x# p! @
unsigned int count_copy = 0;) \  F$ C4 d3 \
. ~& J, l8 [- Y4 \" C  A$ j2 f
int main()
' [) C) p5 p7 y{8 i* n0 Z+ i# l3 A: H
        int fd;
+ P* ]& x6 {$ i        int *mem = NULL;
9 W# N8 {$ }9 R5 A, D2 Z' r5 O" E  Q* @# ?2 M
        if((fd = open("/dev/mem", O_RDWR)) <0)8 C1 E1 z6 f) ?1 b0 w
        {# N# L$ w$ K( Q9 d
                perror("open error");4 E( o, l# b3 z# f- l1 U5 p" `
                return -1;
* P" |0 O7 W* C! ~        }+ B. K$ K& G! O
        + o; \. y, ]7 a7 D+ Q# C7 z
        mem = mmap((void *)SHAER_RAM_BASE_ADDR, SHAER_RAM_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);$ n# ]0 d2 }, ^  b
' w6 w# b) u$ R5 ]6 D" _$ |
        while(1)7 Q, I$ ]5 j0 A' f. d
        {5 K: y% }( [6 r
                read_MSG_buffer(mem);
4 S' p4 q& }4 H8 k; S* s        }                1 O% ]! w: L# N
}& S" o5 e+ z; S4 f0 T# P0 w$ s
* V& j. m# t+ ^
void read_MSG_buffer(int *baseaddr)
" _) z& {' R2 @4 \( j: R) h{
) u3 w/ t- C- V: o        pRX_MSG_PROTOCOL pshreRAM = NULL;
( D6 {4 W9 D. F( T' ~( I8 u# M) R8 ~: }% y
        pshreRAM = (pRX_MSG_PROTOCOL)baseaddr;
% v. S! ]. L# W& n2 Z/ ?+ P8 V+ i' Y" y9 y! j
        if(pshreRAM->packet_cout != count_copy)% G8 H9 z1 a# b. q4 f# Q0 a
        {* N' Z% ]9 L$ s" a! T
                printf("a is %d\n", pshreRAM->a);
2 g. M$ f" Y4 p( B# S                printf("b is %d\n", pshreRAM->b);5 u" P4 L0 x3 U: k, T
                printf("count is %d\n", pshreRAM->packet_cout);7 \+ F; l' R. s/ a" q9 s
                count_copy = pshreRAM->packet_cout;
2 _& b8 W! ^5 N9 P        }
' `* t" ^; r( W& P9 ^' F. t/ m$ J- N        else) s3 F1 v$ |3 }) S
        {* P/ J$ n5 p  W$ G6 K
                printf("No effective message!\n");( n9 t* a1 c. S
        }/ v& \( C0 U& }8 p7 _' k# |
}/ S6 d6 Q$ d, m4 I

$ d! \0 N' h, Z3 X4 H# a没有出现segmentation fault这个错误,但是读出来的数据均为0。这该怎样解决啊???主要问题还是在Linux系统下,OMAPL138是否可以直接访问映射地址???该怎样实现???
# \# N+ s6 v5 G6 o$ c/ S. A, A% K
; r& j% U5 H; V& {) F( y3 x
% y/ @, L: R: d4 a( g2 c. {) I' ?1 N" `/ w
% P: Y( O1 Y2 A1 B) Z8 k
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-11-21 12:12 , Processed in 0.053322 second(s), 27 queries .

Powered by Discuz! X3.2

© 2001-2015 Comsenz Inc.

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