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

嵌入式开发者社区

 找回密码
 立即注册

QQ登录

只需一步,快速开始

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

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

[复制链接]

5

主题

6

帖子

51

积分

注册会员

Rank: 2

积分
51
跳转到指定楼层
楼主
发表于 2014-8-19 16:38:00 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 zc_fly 于 2014-8-19 16:53 编辑 7 ~9 D/ I: V; r9 ~& }* G9 W
. ?5 {# B) D+ H5 R
OMAPL138的ARM端对共享区内存进行直接访问,代码如下所示:#include <stdio.h>
; `! D, c% U  e/ L6 O# w5 O#include <unistd.h>
8 c1 {) v( M; D#include <sys/mman.h>
" x5 z6 E: o: v2 i#include <sys/types.h>
, }( y9 l6 K5 Y/ B. A" V#include <fcntl.h>
+ D+ f- i- Z' A& ^' m$ E) n2 _! U( h: O$ ^$ Z
#define SHAER_RAM_BASE_ADDR    (0x80000000)   : s' @8 U7 ^! p9 i7 o
1 t1 _5 A4 }8 p, c: B
typedef struct3 x5 J9 z/ M3 I1 h( D
{' C5 @# a8 X7 S
        unsigned int a;, d8 b% s: Q' \  R# o! U& X: M8 A0 y
        unsigned int b;6 a3 m  r" B* G8 Y
        unsigned int packet_cout;
9 y* {  V2 C9 n2 D' l# ?}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;7 C0 m5 O& ~  t( G; e4 ?8 u2 R9 b7 z
: T1 j6 }$ ~, f0 z0 J
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM);
0 l" c4 U. T  [" E0 N7 j8 @unsigned int count_copy = 0;" B9 G; y! d/ R8 q; B. M
/ H' N0 B" B. m6 F
8 ]5 L6 Y5 }3 k# X
int main()
4 T/ P# A3 a5 B3 j6 A! n{
# T" b" B7 ]5 U0 l4 D/ X* B- \        pRX_MSG_PROTOCOL pshreRAM = NULL;
: |) ?* E/ p! o5 _0 j        pshreRAM = (pRX_MSG_PROTOCOL)SHAER_RAM_BASE_ADDR;( F6 B& L" U  _% Y1 x/ ?! H

, E# n% g9 r) s6 K) ~1 i( V1 [/ b* w        while(1)
& `7 M9 c/ u6 Q- ^- r* ~! O+ O2 j: r        {+ s+ P; D7 @7 r8 C
                read_MSG_buffer(pshreRAM);1 \; B- R4 Y# O; Q
        }               
' h7 [* o' V2 E( K9 O5 N8 Z5 k}
. U! Y0 o# N: g2 p! M( s, W2 ?0 n1 x9 j. i" k
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM)
  W$ d3 h0 S4 L" K{
- A% u2 m$ D1 O$ F% J! H+ ~        RX_MSG_PROTOCOL buf;
5 ~% `: h& I' P2 a1 h* C& s% {        5 E- H4 |* |( L: ]9 j
        buf.a = pshreRAM->a;
# \5 A$ h$ P* Q* @2 M+ H1 I        buf.b = pshreRAM->b;/ D/ J# @, P6 {- \
        buf.packet_cout = pshreRAM->packet_cout;
/ r% N3 _9 l( Q% N. k2 M        % b5 i; B+ \' k
        if(buf.packet_cout != count_copy)2 i+ z. G5 `4 Y" d- F, P, G
        {
6 N. [3 F) W8 X+ K$ O- d                printf("a is %d\n", buf.a);
1 K! z( ^$ F6 y                printf("b is %d\n", buf.b);
7 u! X8 b' i7 |; N6 M6 Z                printf("count is %d\n", buf.packet_cout);' B) ?: G8 y4 q6 i! j6 [# ~
                count_copy = buf.packet_cout;  T. J8 ^2 M# I- I' @4 P
        }: c! d& G& k+ |( m3 W5 g( I7 T& j1 h
        else" ]8 M0 s  l3 ]* W* ^
        {9 y0 J) O: f/ U4 h0 }' D1 T
                printf("No effective message!");
+ B. y5 Z" @8 i9 X2 t: @        }
& V% B" q4 B5 F/ {7 W3 h2 P5 }}
/ ^+ I% r, ^% F& L( B2 s7 g5 j# L
( N- [& v! R( h! C8 q) ^
但是出现segmentation fault的问题,这是什么原因啊???我在DSP端烧写了一段小程序,向共享区0x80000000位置写入数据,用CCS 测试发现写入成功。
: ~/ s% |: i- t( W使用下面代码,对内存使用了mmap函数后:
' ~$ ], V# N  g7 e* z* _#include <stdio.h>
, H" J# i- `, [8 c- s#include <unistd.h>$ e, c: I: `7 O. \! d
#include <sys/mman.h>
, P6 P% O1 `0 a5 G$ i) @#include <sys/types.h># R! e$ Z; A" H0 B1 l& a
#include <fcntl.h>
& g  \/ r9 ?$ Z' U7 b8 n
& Z6 ~1 R; x0 e! p#define SHAER_RAM_BASE_ADDR    (0x80000000)
/ U6 S# d7 P' K  n1 k#define SHAER_RAM_SIZE         (0x20000)   
  s) f& q- y/ F7 L- `4 z# @% P
8 G, M5 [+ e- C) R' |6 E; q! Q7 qtypedef struct8 D+ g5 o4 P; j! a) O1 k( Q: i
{: j+ t" w  Z3 A# A9 K1 z3 S" g
        unsigned int a;! w- j/ w  B$ E4 k% \* n# m0 y/ j
        unsigned int b;
) j5 e3 o# o. p# B2 F2 c+ \* q6 k! |$ t        unsigned int packet_cout;2 D. y! ~8 W$ |, @( z
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;$ H( T& L1 }6 I0 e
! t+ ~+ K  A/ A; `0 j7 e* V6 Y$ L) _9 i
void read_MSG_buffer(int *baseaddr);9 Q  _1 p) T: D+ B
unsigned int count_copy = 0;9 _; l& f! j7 _4 h2 {# H

* I9 W/ N$ b: Yint main()2 c3 G3 Q9 v) r& |5 u7 I
{
: }, N: m( q+ N        int fd;
, z* ]2 l  C4 d0 _6 z& H        int *mem = NULL;: C* @. i# m# G$ e3 u, Q
5 ~' k4 e# b* p0 ~, V; _) [' B) _& B
        if((fd = open("/dev/mem", O_RDWR)) <0)
& P' `0 M9 R. b- N        {
% h9 u5 |$ Q7 [9 N; |' @6 P                perror("open error");
' O) j9 N# f# o, }% Q( h$ f, h# \                return -1;8 K5 s" M. l3 Y9 Q/ J: W% X
        }
  Q0 ?0 B+ ~( }6 A! m+ `3 K0 H9 V9 B        
  _6 E( p/ w2 M, I        mem = mmap((void *)SHAER_RAM_BASE_ADDR, SHAER_RAM_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);
4 A: ?& g: E# b  h- [/ K/ I
" G* b+ f' Y1 B) e5 I        while(1)
( x+ J0 m2 @* e  x7 I# p        {
* \8 i7 S! A* e2 ]& t* [1 g. P' z# K% s' b                read_MSG_buffer(mem);. ~, c6 p; X5 V" e& a# _
        }               
/ ~# W5 Q4 b1 w; D4 u5 q5 j  E}, x5 i: N  l9 Y0 F) R- X  F
0 I5 |9 e/ \! k1 c$ |8 M  O
void read_MSG_buffer(int *baseaddr)$ [2 h$ }/ L: n) a7 T) M/ k7 y
{3 T% y: x6 B# H
        pRX_MSG_PROTOCOL pshreRAM = NULL;
! R) j. @, `5 J! m2 K  u' w: r& e0 H6 k1 s' g
        pshreRAM = (pRX_MSG_PROTOCOL)baseaddr;
0 R$ l) G! i) A2 c9 I& S. r- n
; R( M7 W- ]  H8 L$ U( [2 S        if(pshreRAM->packet_cout != count_copy)* N2 `, F' S; g% Q6 L) B
        {
: c$ W; S- O* |$ s# P2 D; I3 D+ f! N                printf("a is %d\n", pshreRAM->a);
# d5 m* h+ d+ v/ K4 l& ^/ @                printf("b is %d\n", pshreRAM->b);
1 b; C+ j% B0 _4 E  s1 t$ U                printf("count is %d\n", pshreRAM->packet_cout);
3 D3 @) D: v9 @                count_copy = pshreRAM->packet_cout;
- M# ]% [, A. z/ {% A3 J, S( n9 `        }3 a* D# x; j* b" l
        else( @# P) A, h4 m( E- r
        {
! g) _% ~$ W. ]" ^                printf("No effective message!\n");# m0 N" u/ m* \0 T, v
        }3 l' s8 b# ^3 x. P
}$ m2 w& k9 Y9 A" \
4 }  ]& O! O8 w& Y, d' n
没有出现segmentation fault这个错误,但是读出来的数据均为0。这该怎样解决啊???主要问题还是在Linux系统下,OMAPL138是否可以直接访问映射地址???该怎样实现???
& b5 \4 S+ }6 [4 l
( a; H( u( E. T! e- a" j7 ~- t) ]4 S( j
0 Z. e5 y$ X2 ?$ H2 W- @5 _
( N- _) n# g6 ~8 y
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖
回复

使用道具 举报

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

本版积分规则

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

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

GMT+8, 2026-4-4 14:32 , Processed in 0.039861 second(s), 26 queries .

Powered by Discuz! X3.2

© 2001-2015 Comsenz Inc.

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