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

嵌入式开发者社区

 找回密码
 立即注册

QQ登录

只需一步,快速开始

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

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

[复制链接]

5

主题

6

帖子

51

积分

注册会员

Rank: 2

积分
51
跳转到指定楼层
楼主
发表于 2014-8-19 16:38:00 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 zc_fly 于 2014-8-19 16:53 编辑
7 p' [# M/ r3 h+ T5 D; P- J( M. {4 D% a0 K! ~
OMAPL138的ARM端对共享区内存进行直接访问,代码如下所示:#include <stdio.h>
  r- p% I+ e7 k$ I4 p#include <unistd.h>
, N, w' |( y/ p5 L3 E( h  u1 L6 p6 o#include <sys/mman.h>7 y8 _6 l9 k7 R, _/ |9 a
#include <sys/types.h>( }# V# K9 o  o; |1 Z, [$ E/ C. A% l  ]( _
#include <fcntl.h># Y% {9 U4 [& f% B0 y

% x- [; O6 D- j8 g. g#define SHAER_RAM_BASE_ADDR    (0x80000000)   
5 m% d' C  k+ W4 m( H3 {! v% p0 D7 G! S% L3 L: Q! p( N+ g
typedef struct* \3 q$ I" T) d2 w
{: }& d, O: q& Z' A' ~
        unsigned int a;3 l4 I3 C+ C. v% z+ e
        unsigned int b;" w5 C- h" R4 y3 [4 G
        unsigned int packet_cout;
% j; @$ i" J% }3 v2 v4 W}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;* C. n( \+ q* r$ K5 N

% w% S* c! \( ]# m  vvoid read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM);
* z$ P( @$ Z/ X; G8 Tunsigned int count_copy = 0;' D1 D/ f2 g# ]5 f" S2 Z

4 F# n! @9 \7 }3 J4 q% n' g! }5 u3 Q" m
int main()
/ k( n% e+ Z3 K) m( H: `1 _{
' k5 U& r; H' l+ K. h, b# s! P        pRX_MSG_PROTOCOL pshreRAM = NULL;6 e( m& n) J6 R! p" p6 U! z* }
        pshreRAM = (pRX_MSG_PROTOCOL)SHAER_RAM_BASE_ADDR;5 x5 C5 u- j! S5 {

" E5 f/ V; m0 D9 G1 |: a  E( I        while(1)
8 s/ g1 g' P9 {8 A        {
  g: O. s1 r' u6 [; q( _                read_MSG_buffer(pshreRAM);+ l7 O0 k& ~  ^7 X
        }               
9 j) e. e3 p1 @" z. a, s6 ]- [* ]. T}
' g" s. Q/ X  T& h% ^! k$ N9 g& }  C# v) x! ~9 v( l
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM)7 Q2 H7 v+ e2 F0 v- {
{
# D6 V9 R  i/ r6 H! Y: H4 V; I        RX_MSG_PROTOCOL buf;+ ]5 c- K7 r( S3 W) ]+ y! A
        3 A3 ?! u! Z. s+ y! x/ k
        buf.a = pshreRAM->a;/ f* ~, j. g( o' Z- G6 C8 A8 [
        buf.b = pshreRAM->b;
9 g4 L/ F- H% e5 e# K        buf.packet_cout = pshreRAM->packet_cout;
( b& d, B+ f' ]1 f8 v$ E/ n& G        
5 v7 L* g( j* D5 B5 U        if(buf.packet_cout != count_copy)
" i: ~. `7 i7 a2 V$ _5 {0 B- h+ p        {& w. I3 h8 M7 k7 E
                printf("a is %d\n", buf.a);
5 E8 B9 C; g6 R7 m) z                printf("b is %d\n", buf.b);2 z5 g- a$ M: J4 L
                printf("count is %d\n", buf.packet_cout);$ _$ d. V- W& }4 u+ P4 W' n
                count_copy = buf.packet_cout;$ Z9 F# H  R3 v) p9 F1 p3 Y! O
        }- c' r& J; j  A/ Y5 U
        else* ^- R! B5 A2 Q8 z; ?
        {9 b1 U5 g) {. u/ v
                printf("No effective message!");
& v+ m. Z! b3 K+ w        }2 P8 T% F, h2 V) z4 X( k3 F
}
/ s. h" p' c# F3 m1 t6 j, O* D; @3 n5 q# q; T, t+ _
; ~3 ?" R: S) g. d( ?
但是出现segmentation fault的问题,这是什么原因啊???我在DSP端烧写了一段小程序,向共享区0x80000000位置写入数据,用CCS 测试发现写入成功。
- s2 v; n' M/ P- e7 R* J使用下面代码,对内存使用了mmap函数后:! \9 K# A- ~2 V8 o; `
#include <stdio.h>* _- o# G0 D% {5 D3 ^7 {
#include <unistd.h>8 O! \4 h( M; y/ r
#include <sys/mman.h># n; _* X$ D5 u1 ]! V# K2 q
#include <sys/types.h>
) \! o4 p% w5 o% v- v6 D#include <fcntl.h>
, Q! V2 L+ z& t" Z: P5 _3 ]
3 z: o7 N! p6 M#define SHAER_RAM_BASE_ADDR    (0x80000000)! \; i+ U5 d( u5 C% M  ^2 K
#define SHAER_RAM_SIZE         (0x20000)   
& _6 n" q/ D' L5 V! a  ^- F( M. N# c5 ^* j' j8 ~! C, {' \  c
typedef struct
" A5 O  {& Q; f0 h) C& {" K{
  Y; O$ z2 P2 @4 A        unsigned int a;) s3 T& e! K% J# _* D
        unsigned int b;
) |  e$ a/ l/ q4 q0 K. _, {        unsigned int packet_cout;0 A: Y$ z9 y' U$ T1 N# Z
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;( f& I1 Z' w- P9 M
6 W2 a! i! X3 u
void read_MSG_buffer(int *baseaddr);
6 [2 Z9 v! O% ]9 Xunsigned int count_copy = 0;
4 i  r' Q$ |. N1 \5 H' {5 K& O9 H: Q. C- B( S5 C! |
int main()+ n9 U) |5 R: E
{
& \4 c! Q: i% `9 f* h, y        int fd;# y7 b+ f$ Y& Q9 X9 `0 R
        int *mem = NULL;
6 j5 b, G5 F4 }4 y# m( R  b. I, S: h6 K$ C: ?! e, ?" n
        if((fd = open("/dev/mem", O_RDWR)) <0)5 v' m9 x9 {. P; E" |0 L1 A
        {# x7 p1 ?0 P" J: r$ l
                perror("open error");! f7 E* k& t; W6 R* s6 ~
                return -1;
- F8 R7 H+ u/ l: ~: F; F        }+ F7 ^- S6 y9 T& V) _
        
! a% R6 ~9 ^( b) F1 t- |) F        mem = mmap((void *)SHAER_RAM_BASE_ADDR, SHAER_RAM_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);6 u. r3 t; x7 E9 o8 a

! y- d3 e- ^3 w& e( D" p        while(1)
1 T9 q: Z# ~: [6 ^  }% c        {" {0 {" D, l, q( g5 X$ _6 l
                read_MSG_buffer(mem);. |# P7 p% w( _# _9 ?+ C2 q
        }                4 A0 h8 y3 p5 y" |
}8 K+ [8 J# G# n; g3 [

. F$ D$ B1 Z1 E8 bvoid read_MSG_buffer(int *baseaddr)* q0 w' s  }" L' R6 K' N
{
# Z8 x9 U/ {0 Z0 x2 h/ w. [        pRX_MSG_PROTOCOL pshreRAM = NULL;
. _# z/ g+ ]6 M3 J. z6 l' B: s3 a, Y$ w, A) y
        pshreRAM = (pRX_MSG_PROTOCOL)baseaddr;! b4 I  n1 `. d' ^
  e2 z' G* f; ^2 f
        if(pshreRAM->packet_cout != count_copy)
5 m7 q) P2 R* i4 o4 A  W+ }" ?6 F        {+ ?; T/ I5 c( h9 m. H% R
                printf("a is %d\n", pshreRAM->a);
- n4 w. i/ E  ]                printf("b is %d\n", pshreRAM->b);) V: n) \( F  O0 Y1 z
                printf("count is %d\n", pshreRAM->packet_cout);# v4 `  f) j  u- c3 P1 g4 L- @
                count_copy = pshreRAM->packet_cout;
' i- [9 ~  Y/ Q' M6 ]        }) N4 Q* ^- ^! z$ t: K
        else
5 k% W& I7 c+ }$ ]        {! [+ L3 W0 @1 d! @
                printf("No effective message!\n");
" J- ~8 E+ t  Y5 c& p        }
  R0 O4 S& ~  W- i: r}% q2 o7 B, c! ~5 p

. s( Q9 r6 @1 x; ?没有出现segmentation fault这个错误,但是读出来的数据均为0。这该怎样解决啊???主要问题还是在Linux系统下,OMAPL138是否可以直接访问映射地址???该怎样实现???
! `7 d) n' o  a% O7 X* G* f
! N: F) x. I' f% x8 A7 n: g% H7 I4 Y# P
" v% y& N3 q0 ~6 |

* a) b5 f: Z- m3 I4 c4 {1 m7 i
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖
回复

使用道具 举报

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

本版积分规则

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

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

GMT+8, 2026-1-31 17:35 , Processed in 0.040083 second(s), 26 queries .

Powered by Discuz! X3.2

© 2001-2015 Comsenz Inc.

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