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

嵌入式开发者社区

 找回密码
 立即注册

QQ登录

只需一步,快速开始

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

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

[复制链接]

5

主题

6

帖子

51

积分

注册会员

Rank: 2

积分
51
跳转到指定楼层
楼主
发表于 2014-8-19 16:38:00 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 zc_fly 于 2014-8-19 16:53 编辑
, I$ A, P* x; ~% k( l+ z4 q  _1 I4 J& [' f( f' j6 q# K
OMAPL138的ARM端对共享区内存进行直接访问,代码如下所示:#include <stdio.h>* p) L  r) v& Q8 v' h2 N9 b2 L! L
#include <unistd.h>+ }2 r) f% V# x- T4 H# ~# h
#include <sys/mman.h>
0 N: [/ ?( ]' G% w/ [( f* {#include <sys/types.h>
9 |5 _7 p$ C+ o( F$ p#include <fcntl.h>! \. }, p0 Q. q( v" \

* U* e, r4 r! c* Z/ g  }; M#define SHAER_RAM_BASE_ADDR    (0x80000000)   
5 \4 y' }% c- a- [3 J- S. c
/ ]$ T3 D/ l7 j. ]# W% ltypedef struct1 f' F  |) {$ Z' y
{5 L5 S* b: Z+ N
        unsigned int a;
" Y, s# ]4 B0 q# @3 I- {  W        unsigned int b;" s5 M; t) Z' f/ \
        unsigned int packet_cout;
; x; p) A6 D$ w: w9 H}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
3 ]) b3 h3 V( p! r! ]7 d
. J! r0 {0 E! E1 }void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM);
7 [2 _2 E0 p  w, X& Zunsigned int count_copy = 0;
) A. `7 {# H) z2 [; E
, z4 N8 V6 T# W( `. C/ Z6 h* ?* p0 t$ `; b' L
int main()
% {0 T* R& d/ C8 P! r8 l6 w{
  S4 f8 f  R' L. \1 }1 x- W        pRX_MSG_PROTOCOL pshreRAM = NULL;  @& @* b0 S, `; z
        pshreRAM = (pRX_MSG_PROTOCOL)SHAER_RAM_BASE_ADDR;
% @: k% @* o$ M/ C4 C
4 K& L( J% j: R! Z5 j9 b        while(1)
1 g6 Y6 G5 z- C! f3 x2 g        {5 x4 E" {4 N3 j2 F! x: d
                read_MSG_buffer(pshreRAM);3 |: {! J1 Y7 t1 f5 ?: h# |
        }               
* o5 V( V* f: }) r, `( [}; Q; r: Q+ Z4 U8 ]0 d
' U% D# O* \2 X, q2 x9 @
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM)
% R2 d( v% n3 U{
. T2 `( N+ N- m& Q9 X" F! A        RX_MSG_PROTOCOL buf;; o* x4 G1 y% T6 Y
        ( i# {3 C" W, |3 S* W$ j
        buf.a = pshreRAM->a;
, ~6 I+ y- t+ W1 b9 y        buf.b = pshreRAM->b;
5 K. _+ g* a- W* _        buf.packet_cout = pshreRAM->packet_cout;
* d0 ^$ _2 X9 v8 L5 `  ^" e1 ~9 P, L        - V* P$ y+ ~# p" m
        if(buf.packet_cout != count_copy)* {) z1 W" k& Q; F8 q4 e$ T
        {
1 E7 _: p, V2 o                printf("a is %d\n", buf.a);3 H# _" G7 {: l; S4 K
                printf("b is %d\n", buf.b);
8 ~% ]3 o) W- q( i* u, a8 O7 m# W, m                printf("count is %d\n", buf.packet_cout);8 W, ~) Z6 ~; D1 O4 p
                count_copy = buf.packet_cout;
. m; o6 E( ~( d        }
, w7 Q0 V, r$ G- c% Y! V) E# y, G$ P        else
( Q4 i2 ^4 b6 l4 l        {% G0 A' ]1 Q' X  e# Q  q+ b
                printf("No effective message!");
. V0 F3 h: g8 {2 y3 V$ T        }4 ^& ^0 b' S" F7 v
}
  b8 C( E* ~( [& S7 g+ |% V
7 ~! Y. A" j7 j
! f5 t' {7 @4 J* d2 E6 y* Y但是出现segmentation fault的问题,这是什么原因啊???我在DSP端烧写了一段小程序,向共享区0x80000000位置写入数据,用CCS 测试发现写入成功。
2 r7 C% y2 g7 ]% P3 ?8 D使用下面代码,对内存使用了mmap函数后:
! K, ?, B3 e+ N% r#include <stdio.h>! g% o, g2 j( l0 O' p
#include <unistd.h>
3 {5 e# `8 t. i+ ^/ k#include <sys/mman.h>
3 p( e9 h9 ?* T3 @+ x, W#include <sys/types.h>0 h5 F* m0 p( H& H) i2 [
#include <fcntl.h>
: h  q( ^( ~% r' R" v8 G
3 z9 q8 D9 S6 L# ~#define SHAER_RAM_BASE_ADDR    (0x80000000)$ U9 J$ S$ M! r
#define SHAER_RAM_SIZE         (0x20000)   
5 W# ~% X2 k9 ?4 p" H7 H2 ^; r1 G" x" I' ?. {. x! ?
typedef struct
/ e* F* T' Y4 x4 ^{1 |' l8 ]1 x. L# _; q! [4 p' M
        unsigned int a;
5 @6 @  s+ z- N        unsigned int b;
' H6 Y( v- \) o; @& w) b        unsigned int packet_cout;4 F* h1 }3 A* s, M5 r" i# q" W
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
: |, D: M6 N2 S' a5 l
4 b3 c" q! W5 h7 |void read_MSG_buffer(int *baseaddr);
5 Y9 N- d2 B) D3 N6 a6 j2 aunsigned int count_copy = 0;( P# y. ^$ ?: W  Q. J% [) [( R; r

# T/ k7 u+ F. u- D  x: k  yint main(). L9 B) ^6 w: B0 ^0 d
{3 a/ s4 t; T; ]$ O, A/ a4 g* r+ a
        int fd;
" y" q9 b8 R# G1 U2 r        int *mem = NULL;
' N1 y0 T( F& E% n% B+ n+ _: I! z: c0 M# b
        if((fd = open("/dev/mem", O_RDWR)) <0)
" K) I9 F. T: ~& k        {
. f6 [+ q) d: h5 {% s                perror("open error");
: f+ ~$ H2 G  d                return -1;
5 f: w3 {; n* x% l) N        }
5 S9 Q5 i1 k4 i4 s: [" z/ i        
# Q" i' z( e+ |6 X, n        mem = mmap((void *)SHAER_RAM_BASE_ADDR, SHAER_RAM_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);0 B1 B6 A, [, u1 W0 f$ l2 f  S
: q: F0 @6 G6 ?; i' r: _
        while(1)2 c3 E4 w, N5 E# J
        {6 H# h" D8 q2 K) K
                read_MSG_buffer(mem);
8 U5 }0 u% M" n6 D1 f- o        }                  K+ R6 w" M$ I+ n! W. O
}  X+ H  P6 J3 f& R

2 S# ]1 f! `. S, R- h) \+ B& a% [void read_MSG_buffer(int *baseaddr)
( R  |* B2 c0 i. B4 M{9 Y5 ^8 v, j; n
        pRX_MSG_PROTOCOL pshreRAM = NULL;
/ f3 S, U. b( L/ b9 v8 |3 V4 B  G* e6 X! `% J9 f1 L
        pshreRAM = (pRX_MSG_PROTOCOL)baseaddr;
% J# Y0 b! y( T$ F$ F8 Z! D. A, w" ^; A4 q( U
        if(pshreRAM->packet_cout != count_copy)
/ B: @# @& j9 }! H9 L        {, S5 X; V! v  f( \2 v
                printf("a is %d\n", pshreRAM->a);
* g4 B0 n4 M0 v" S6 q. G                printf("b is %d\n", pshreRAM->b);
& G2 |( G* a9 L" i0 W8 H  \8 z2 \                printf("count is %d\n", pshreRAM->packet_cout);
* H2 W* ^9 u& @! ?- Z: H  A                count_copy = pshreRAM->packet_cout;% D8 c6 M0 X9 P/ h8 h. `$ a
        }' O" ]* Y+ t& O. Q* Z- U5 Z8 u4 L
        else: F% k5 ?, s" _. Y8 K
        {2 M% b9 Z' {& j. h3 k, b: A# c
                printf("No effective message!\n");. d5 c9 T& r7 g1 }  j
        }/ m) e8 q5 Z2 X5 z
}& M  Y7 c$ _  A( |8 |% K
2 N4 M0 C+ ?% g+ c4 f0 E7 A! l! o5 p
没有出现segmentation fault这个错误,但是读出来的数据均为0。这该怎样解决啊???主要问题还是在Linux系统下,OMAPL138是否可以直接访问映射地址???该怎样实现???! n9 G) e8 m! S& h, y

. v( L- {1 m/ z$ x$ u+ ?2 Y" J0 d0 u/ F( G
% e. t0 o# B3 C4 x* H$ l
- e! |8 u" |* {! _4 o6 ~; p7 A7 H
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-12-12 11:42 , Processed in 0.038549 second(s), 25 queries .

Powered by Discuz! X3.2

© 2001-2015 Comsenz Inc.

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